于是今天就尝试自己做uC/OS-II的移植:(记下几个关键的步骤) 1. OS_CPU.H - OS_CRITICAL_METHOD=1 (51单片机使用方式1)
#define OS_ENTER_CRITICAL() EA=0
#define OS_EXIT_CRITICAL() EA=1
因此 OS_STK_GROWTH 0
任务切换由OSCtxSw()完成,OSCtxSw()由汇编语言写!
- InitHardware (void)reentrant 初始化硬件时钟中断
2. OS_CPU_C.C - OSTaskStkInit() 关于堆栈。最后仅仅理解大致的步骤是怎样,但是目前要我自己写还是很有难度,最后则拷贝了网上下的对应的文件。
3. OS_CPU_A.ASM 4. 关于INCLUDES.H和uC/OS-II.C等一系列文件都要修改下头文件;而且源文件对于函数声明都要设置为可重入reentrant(KEIL在缺省情况下编译代码为不可重入) eg. uC/OS-II.H (790)
void OS_TaskIdle (void *data);
改为
void OS_TaskIdle (void *data)reentrant; (类似的要修改的实在太多了)
5. 最后在网上找到一篇关于uC/OS-II移植到51的心得,很值得细看,许多问题都提到了: 好好坚持! btw
-任务切换:OSTCBHighRdy必须指向优先级最高的任务控制块OS_TCB
OSTCBHighRdy->OSTCBPrio 任务的优先级
-任务在OSTaskCreate之后即进入就绪表。
-就绪表:OSRdyGrp& OSRdyTbl[]
-任务调度:OS_Sched中OS_TASK_SW()中都系汇编语言,未用心去睇。
|