代码主要基于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编辑过] |