首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

移植ucos的问题~~

移植ucos的问题~~

根据邵贝贝老师的书上的移植代码将ucos移植到s12上,测试移植代码的时候发现程序执行到OSStartHighRdy()的时候过不去了
OSStartHighRdy的代码如下

void OSStartHighRdy(void)
{

OSTaskSwHook(); // Call Hook function

asm{
ldx OSTCBCur // Load the value in OSTCBCur or the TCB's address to x
lds 0,x// Load the value pointed by OSTCBCur to sp
inc // OSRunning = 1
pula
staa $30 //restore ppage from stack
nop
rti
}

}

用BDM调试的时候将程序单步执行到
staa $30 //restore ppage from stack
这句的时候assembly窗口的汇编语句变成了无止尽的staa 0x5a 无法跳出来了
这是怎么回事呢

我并没有添加任何任务,按照jean j.labrosse的书上说此时应该执行空闲任务OS_TaskIdle()
不明白staa $30里面的$30地址是什么的地址
最多300字节 文字将出现在您发表的文章的结尾处。体现您的个性。
我也遇到了相同问题,程序到这个函数就跑飞了,不知道为什么。。。
0x0030为页地址寄存器,staa $30就是加载先前保存的页地址寄存器的内容,一般这样写比较好:
#if defined( __BANKED__) || defined(__LARGE__)
ldaa 0,sp
staa 0x0030
ins
#endif
当使用带有分页的Flash时,需要保存页地址寄存器的内容,你用的大概是不包含分页的单片机或者你创建新的project时选择了small而非banked模式.
解决方法是你需要在保存或是加载页地址寄存器内容的时候,加上如上所述的#if预处理指令,表示在有分页的时候使用该段保存或加载页地址寄存器内容的代码,无分页时不使用该段代码.
对不起..
楼上的老兄,我选择的是banked模式的。我感觉问题出现在我的.prm或.startup文件中。
我的.prm文件用的就是系统生成的,没有修改。

而且,我在编译时,发现有一个警告,也可能是问题根源。
C12052 stack-pointer change not in debugging-information
这个可能是说SP在调试模式不能被修改,所以后面当面会出错,但是我在直接下载,然后运行发现也还是不行,而且那个老外的书里要求单步运行,岂不是有点矛盾。
我也遇到这个问题,大家谁知道怎么解决的吗?

把你这个函数定义到NON_BANKED里试一下,改ppage的操作,函数要是不在固定页里,肯定出错。

关于内存模式

我试了一下,发现如果新建工程的时候选small内存模式就可以运行,选banded 内存模式运行到OSStartHighRdy()中的最后一句rti返回时就跑飞了,这是为什么呢?

终于跑起来了,原来small和banked模式在堆栈初始化时是不一样的
hehe
请问楼上:有没有Assembler_HC12.PDF
返回列表