查看: 2908|回复: 1

[其他] xep100在调用位于RAM区的FLASHDRVER时出错

[复制链接]

该用户从未签到

6

主题

37

帖子

0

注册会员

Rank: 2

积分
51
最后登录
1970-1-1
发表于 2012-8-6 11:07:36 | 显示全部楼层 |阅读模式
 在做FLASH BOOTLOADER时,当BOOTLOADER在调用位于RAM区的FLASHDRIVER时出错,通过一步一步调试时发现,在通过rtshc12.c的void __far _FCALL(void)函数时程序跑飞,在rtshc12.c文件中对于void __far _FCALL(void)函数是这样描述的:
/*----------------- FAR FUNCTION PTR Call ------------------------------------------------
  Parameters:
  - the normal function parameters according
  - on the stack: address of function to be called
 
  Result :
  - Function is called with unchanged D & X register
  - Y is changed
  - the function address is removed from the stack before the function call
 
 
  Stack layout (in):
    5, SP  : page of function to be called
  3-4, SP  : offset of function to be called
  1-2, SP  : offset of return address
    0, SP  : page of return address
       function ptr to be called (3 bytes)
       return address caller     (3 bytes)
  Idea:
       exchanging function ptr and return address
       because function ptr and return address have the page at different offset a
       complicated transformation must be done
              before        after
      0,SP    page ret  A    page fkt  F
      1,SP    high ret  B    high fkt  D
      2,SP    low  ret  C    low fkt   E
      3,SP    high fkt  D    page ret  A
      4,SP    low fkt   E    high ret  B
      5,SP    page fkt  F    low  ret  C
 
*/
 
#pragma NO_FRAME
#pragma NO_ENTRY
#pragma NO_EXIT
#ifdef __cplusplus
extern "C"
#endif
 
void __far _FCALL(void) {
  __asm {
    LDY   1, SP                    ; A B C D E F    Y = B C   ; 2 bytes
    MOVW  3, SP,  1, SP            ; A D E D E F    Y = B C   ; 4 bytes
    MOVB  0, SP,  3, SP            ; A D E A E F    Y = B C   ; 4 bytes
    MOVB  5, SP,  0, SP            ; F D E A E F    Y = B C   ; 4 bytes
    STY   4, SP                    ; F D E D B C    Y = B C   ; 2 bytes
                                   ; F D E A B C              ;16 bytes
    RTC                            ; call function pointer
  }
}
 
在进入该函数的时候,编译器的汇编窗口显示的指针地址是指向映射到的地址的,但是在运行该函数之后程序就跑飞了,要么是系统重启,或者是提示ILLEGE_BP,
求个人帮忙分析下是什么原因导致出错的,谢谢!
我知道答案 目前已有0人回答
回复

使用道具 举报

该用户从未签到

6

主题

37

帖子

0

注册会员

Rank: 2

积分
51
最后登录
1970-1-1
 楼主| 发表于 2012-8-6 13:51:40 | 显示全部楼层

回复:xep100在调用位于RAM区的FLASHDRVER时出错

忘记说了,FLASHDRIVER是放在未分页RAM区0x2000至0x22FF的范围内,会不会是因为地址信息错误导致出错呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-6 19:24 , Processed in 0.090779 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表