傻大方


首页 > 知识库 > >

移植|移植μCOSII中英文翻译资料( 三 )


按关键词阅读: 移植 COSII 资料 翻译 中英文


实际上C/OS-II已经被移植到了Z80处理器上 , C/OS-II也同样是可以的 。
(3) OS_CPU_A.ASMC/OS-II的移植实例要求用户编写4个简单的汇编程序:OSStar 。

15、tHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()如果编译器支持插入行汇编代码 , 就可以将所有与处理器相关的代码放到OS_CPU.C文件中 , 而不必再有单独的汇编语言文件 。
OS_CPU_A.ASM, OSStartHighRdy()OSStart()函数调用OSStartHighRdy()来使就绪态任务中优先级最高的任务开始运行 , 在调用它之前 , 要已经建立了至少一个应用任务 。
OSStartHighRdy()假设OSTCBHighRdy指向最高优先级任务的任务控制块 。
就像先前提到的 , 在C/OS-II中处于就绪态任务的堆栈结构看起来就像刚发生过中断一样 , 所有的寄存器都 。

16、保存在堆栈中 。
要想运行最高优先级任务 , 需将所有处理器按顺序从任务堆栈中恢复出来 , 并且执行中断返回指令 。
为简单起见 , 堆栈指针总是存储字任务控制块的开头 。
换句话说 , 也就是需要恢复的任务堆栈指针总是存储在任务控制块的偏移地址为0的位置 。
注意到OSStartHighRdy()必须调用OSTaskSwHook()函数 , 但OSStartHighRdy()函数只是做了任务切换工作的一半只是完成了高优先级任务寄存器的恢复 , 而并没有保存当前任务的寄存器 。
OSTaskSwHook()函数必须检查OSRunning位 , 以确定OSTaskSwHook()函数是被OSStartHighRdy()调用的(OSRunnin 。

17、g是FALSE) , 还是在正常的任务切换之中(OSRunning是TRUE)被调用的 。
OS_CPU_A.ASM, OSCtxSw()任务级的切换是通过执行软中段指令 , 或者依据处理器的不同 , 执行TRAP指令来实现的 。
中断服务子程序 , 陷阱或异常处理的向量地址必须指向OSCtxSw() 。
如果当前任务调用C/OS-II提供的功能函数 , 并使得更高优先级任务进入了就绪态 , 在系统服务调用的最后 , C/OS-II会调用OSSched() , 并由此推断出当前任务不是需要运行的最重要的任务了 , OSSched()先将最高优先级任务的地址装载到OSTCBHighRdy , 再通过调用OS_TASK_SW()执行软中断或陷阱指 。

18、令 。
注意变量OSTCBCur已经包含了指向当前任务控制块的指针 。
软中断指令会强制将处理器的一些寄存器保存到当前任务的堆栈中并使处理器执行OSCtxSw() 。
OSCtxSw()示意性代码如T2 , 这些代码必须用汇编语言编写 , 因为用户不能直接在C语言中访问CPU寄存器 。
void OSCtxSw(void)保存处理器寄存器;在当前任务的任务控制块中保存当前任务的堆栈指针:OSTCBCur-OSTCBStkPtr = Stack pointer;
Call user definable OSTaskSwHook();
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHi 。

19、ghRdy;
得到将要重新开始运行的任务的堆栈指针:Stack pointer = OSTCBHighRdy-OSTCBStkPtr;
从新任务的任务堆栈中恢复处理器所有寄存器的值;执行中断返回指令; T2 OSCtxSw()的示意性代码 OS_CPU_A.ASM, OSIntCtxSw()OSIntExit()通过调用OSIntCtxSw() , 在ISR中执行任务切换功能 。
因为OSIntCtxSw()是在ISR中被调用的 , 所以假定所有的处理器都被正确地保存到了被中断任务的堆栈之中 。
OSIntCtxSw()的示意性代码如T3所示 , 这些代码必须用汇编语言编写 , 因为在C语言中不能直接访问CPU寄存器 。
如 。

20、果编译器支持插入汇编语言代码 , 就可以将OSIntCtxSw()的代码放在OS_CPU_C.C文件中 , 而不放在OS_CPU_A.ASM文件中 。
实际上如果需要 , 可以跳转到OSCtxSw()中相同的代码 , 以减少代码量 。
void OSIntCtxSw(void)调用用户定义的 OSTaskSwHook();
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
得到将要重新执行任务的堆栈指针:Stack pointer = OSTCBHighRdy-OSTCBStkPtr;
从新任务堆栈中恢复所有处理器寄存器;执行中断返回指令;T3 OSIntCtxSw()的 。

21、示意性代码 OS_CPU_A.ASM, OSTickISR()C/OS-II要求用户提供一个周期性的时钟源 , 来实现时间的延迟和超时功能 。
时钟节拍应该每秒发生10100次/秒 。
为了完成该任务 , 可以使用硬件定时器 , 也可以从交流点中获得50/60Hz的时钟频率 。
必须在开始多任务后 , 即调用OSStart()后 , 启动时钟节拍中断;然后 , 可以在OSStart()运行后 , C/OS-II启动运行的第一个任务中初始化节拍中断 。
通常容易犯的错误是 , 在调用OSInit()和OSStart()之间打开了时钟节拍 。
(如程序清单T4所列) 。
void main(void)OSInit();
/* 初始化 C/OS-II。

22、*/* 应用程序初始化代码 */* 调用 OSTaskCreate() 建立至少1个任务 */开时钟节拍中断;
/* 千万不要在这里开中断 */OSStart();


来源:(未知)

【学习资料】网址:/a/2021/0406/0021864430.html

标题:移植|移植μCOSII中英文翻译资料( 三 )


上一篇:2021|2021年公司办公室文员办公室实习报告范文

下一篇:农村信用社|某农村信用社信息科技风险管理经验交流