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

uC/OS-II成功移植到S12DG128

kangshiyin[at]gmail[dot]com

uC/OS-II成功移植到S12DG128

代码主要基于uC/OS网站的S12NE64移植范例,同时参考了邵贝贝老师的移植方案

NE64的移植范例是用ECT7产生节拍中断,考虑到计数器资源有限,改用邵老师的方案,使用RTI中断
任务栈初始化对CCR寄存器赋值0x00而不是NE64范例的0xc0,以便允许XIRQ和STOP指令

两个方案比较,任务切换的过程没有区别,只在创建任务的时候,初始化任务的PPage寄存器方法有点不同。邵的方案对PPAGE和任务入口地址都使用绝对地址,不太符合高级语言的习惯,另外必须创建额外的任务变量初始化PPAGE,由pdata指针传递。实际上,正如NE64的范例所示,任务函数指针在banked模式下默认为__far类型,3字节,其中已经包含PPAGE信息,不必另外指定

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
{
......
*--wstk = (INT16U)(((INT32U)task) >> 8); /* Return address. Format: PCHCLPAGE (cut out PPage) */
......
*--bstk = (INT8U)task; /* Save the PPAGE register */
......
}

因此使用NE64范例的方案,任务入口函数可以在任意位置创建,只要使用__far方式访问即可

另外,不明白NE64范例中上述函数的注释6为什么说task入口函数必须放在NON-PAGED空间(见下文)
测试时,link自动分配在0x388000地址运行正常,反而是yong用#pragma CODE_SEG __NEAR_SEG NON_BANKED修饰task入口函数,系统不能运行
估计是移植时没有更新注释

* 6) All your tasks are assumed to be in NON-PAGED memory. However, the tasks can call
* functions in PAGED memory and if a context switch occurs, the proper page will be
* saved/restored by uC/OS-II. Page #0 is stored onto the task's stack as a 'dummy'
* value.

[此贴子已经被作者于2007-6-13 12:16:40编辑过]

返回列表