打印

问段程序 freescale 8 位机

[复制链接]
1976|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
416775364TP|  楼主 | 2012-10-30 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 416775364TP 于 2012-10-30 14:04 编辑

[local]1[/local]#define  RamLast 0x086F    // RamTop
void OsInit()
{
*((INT16U*)(RamLast - 1)) = (INT16U)sModeSw;
__asm
{
CLRA
STA RamLast - 2
STA RamLast - 3
STA RamLast - 4
}
OSModeSp.wAddr = RamLast - 4;
}
void OsTmIntIsr()
{
  if(??)
    {
    OsTmIntIsrAsm();
    }
}
void OsTmIntIsrAsm()
{
__asm
{
PSHH // 此处将H为什么要推入堆栈,保存下也是可以,尚能理解
PSHX
PSHA
TSX // 此处SP获得的值是不是上面推入堆栈的值,具体代表什么意思没看懂。
PSHH
PULA
STA OSMainOrIntSp.Byte.bAddrH //此处变量定义为联合里面加结构体。
STX OSMainOrIntSp.Byte.bAddrL      
   
LDX OSModeSp.Byte.bAddrL     //此处变量定义为联合里面加结构体。   
LDA OSModeSp.Byte.bAddrH      
PSHA
PULH
TXS
PULA
PULX
PULH
}
}
void main()
{
SystemInit();    //省略
OsInit()
sTimerInit();   //100us 一次中断,中断服务子程序OsTmIntIsr 省略一些内容
for(;;){}
}


前后台系统的入口程序,还有一个出口程序
此段程序为一个定时中断服务子程序(OsTmIntIsr),也是一个子程序的入口程序。后续还有个出口程序。我没看懂如何进去的,当然出口也是迷茫。
首先就是汇编代码江H:X和A推入堆栈然后TSX此指令操作的时候是怎样把SP中数据放入H:X的,顺序怎样,上面TSX指令是把前面前面两行代码中的H:X放入堆栈中吗?

发两个实用的。

HC08_C-Language.pdf

1.33 MB

关于Codewarrior_中的_prm_文件.pdf

1.37 MB

相关帖子

沙发
dongshan| | 2012-10-30 16:15 | 只看该作者
很简单,二句话可以概括其功能:
在这里假设那二个结构体有一个Word成员,是16位的。
OSMainOrIntSp.Word = SP;   //保存当前的SP值
SP = OSModeSp.Word;          //用OSModeSp.Word值初始化SP。SP是栈指针
=============================================================

PSHH    ;入栈是为了保护现场,因为下面会用到H寄存器,以前用汇编写程序时,都是这样的。
PSHX    ;同上
PSHA    ;同上
TSX      ;SP的值(是栈地址)加1后,赋给H:X,即 H:X = SP+1
PSHH   ;H入栈,也就是SP地址的高字节入栈
PULA   ;SP地址的高字节从栈中弹出到A,其实这句与上句,功能就是A = H
STA OSMainOrIntSp.Byte.bAddrH  ;   OSMainOrIntSp.Byte.bAddrH = A
STX OSMainOrIntSp.Byte.bAddrL   ;   OSMainOrIntSp.Byte.bAddrL = X  
   
LDX OSModeSp.Byte.bAddrL     ; X= OSModeSp.Byte.bAddrL     
LDA OSModeSp.Byte.bAddrH     ; A=  OSModeSp.Byte.bAddrH     
PSHA                                         ;
PULH                                         ;与上句一起,就是 H = A
TXS                                           ; SP = H:X -1
PULA                                         ;按一开始入栈的相反顺序出栈,恢复现场。
PULX
PULH
/////////////////////////////////////////////////////////////
上面在SP赋值时,为什么会有加一,减一的操作,是因为hcso8的芯片是向下生长的空堆栈,也就是在压入数据时,地址是向下生长的,另外压入数据后,SP会减一,指向下一个可用的位置。

不知道说清楚了没有。

使用特权

评论回复
板凳
252tp| | 2012-10-30 19:34 | 只看该作者
2# dongshan
谢谢你的详细解答,我对HCS08核心的指令集比较熟,堆栈进出也懂。
主要是问TSX语句返回的上面H:X值有什么用,应该返回的值该是上面程序跳转到汇编程序的PC加上n的值才有意义啊。

使用特权

评论回复
地板
duhemayi| | 2012-10-31 08:21 | 只看该作者
看看

使用特权

评论回复
5
dongshan| | 2012-10-31 11:15 | 只看该作者
仔细看了下,这段代码其实就是OS的任务切换代码,上面的H,X,A出入栈注释不准确,至于你说的PC指针的问题,我后面会试着解释一下,重新注释如下:

PSHH    ;保存当前的H值,因为每个任务的H值可能会不同。
PSHX    ;同上
PSHA    ;同上
TSX      ;SP的值(是栈地址)加1后,赋给H:X,即 H:X = SP+1
PSHH   ;H入栈,也就是SP地址的高字节入栈
PULA   ;SP地址的高字节从栈中弹出到A,其实这句与上句,功能就是A = H
STA OSMainOrIntSp.Byte.bAddrH  ;   OSMainOrIntSp.Byte.bAddrH = A
STX OSMainOrIntSp.Byte.bAddrL   ;   OSMainOrIntSp.Byte.bAddrL = X  
   
LDX OSModeSp.Byte.bAddrL     ; X= OSModeSp.Byte.bAddrL     
LDA OSModeSp.Byte.bAddrH     ; A=  OSModeSp.Byte.bAddrH     
PSHA                                         ;
PULH                                         ;与上句一起,就是 H = A
TXS                                           ; SP = H:X -1
PULA                                         ;恢复新任务的A值
PULX                                         ;恢复新任务的X值
PULH
=====================================
由于代码不完整,只能试着推测一下。中断时,执行OsTmIntIsrAsm之前的PC值,也就是当前任务的返回值,会入栈,在OsTmIntIsrAsm之中,接着会H,X,A入栈,这些都是当前任务的运行环境,然后,把当前的SP指针赋给H:X, 并最保存到OSMainOrIntSp,也就是保存当前的运行环境到OSMainOrIntSp。接着从OSModeSp中恢复一个新的运行环境。至入OSModeSp在何处被写入的,代码并不完整,所以不得而知。 如果你画出栈的详细图,就清楚了。

使用特权

评论回复
6
416775364TP|  楼主 | 2012-11-8 21:08 | 只看该作者
5# dongshan
谢谢你,现在我已经看明白了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:兴储世纪科技股份有限公司+软件工程师
简介:本人从事电源行业10年有余,主要从事过UPS软件开发及维护、车载OBC软件开发、300-3000W高频逆变器软件开发、工频逆控一体机软件开发、便携式交直流电源软件开发.

72

主题

744

帖子

6

粉丝