移植 msOS_V0.11_20150807 到 Nu-LB-NUC140
E:\Nu_LB_Nuc140\work\Nu_LB_NUC140_msOS_V0.11\
遇到问题:1
…\System\OS\os.c(264): error: A1854E: Unknown opcode ‘CBZ’, maybe wrong target CPU?
…\System\OS\os.c(267): error: A1874E: Specified register list cannot be loaded or stored in target instruction set
…\System\OS\os.c(279): error: A1618E: Specified instruction is not supported by the current instruction set
下面的代码是 CM3 支持的指令集, 部分指令在CM0 中不支持
/*******************************************************************************
* 描述 : 任务切换,在PendSV中断中实现
*******************************************************************************/
__asm void PendSV_Handler(void)
{
IMPORT CurrentTaskPointer
IMPORT NextTaskPointer
CPSID I // 关闭中断
MRS R0, PSP // 读取PSP到R0
LDR R2, =CurrentTaskPointer // 获取指向当前任务指针的地址
LDR R3, =NextTaskPointer // 获取指向新任务指针的地址
CBZ R0, NextTask // 复位后,任务启动时,从中断模式跳转到任务中
// 入栈
SUBS R0, R0, #32 // 栈顶减32,即8Word
STM R0, {R4-R11} // 压栈R4~R11,8个寄存器
LDR R1, [R2] // 获取指向当前任务的指针,也指向第一成员StackPointer
STR R0, [R1] // 把当前栈顶存入表中第一个成员
// 获取新栈顶
NextTask
LDR R0, [R3] // 获取新任务指针变量值
STR R0, [R2] // 赋值给当前任务指针变量
// 出栈
LDR R0, [R0] // 加载新任务栈顶到R0
LDM R0, {R4-R11} // 加载栈内容到R4~R11
ADDS R0, R0, #32 // 新栈顶升32,即8Word
MSR PSP, R0 // 新栈顶写入PSP
ORR LR, LR, #0x04 // LR的倒数第三位写入1,中断退出后进入任务模式,使用PSP栈
CPSIE I // 开中断
BX LR // 返回
NOP
}
ucos 的版本
http://www.eefocus.com/wangsw/blog/13-01/291065_0bb1c.html
对很多只具有MCU51,Cortex基础的网友来说,学习RTOS是一件痛苦的事情,以uCOS为例,博主以前看过2遍,虽然有些概念,但因为涉及内容较多,理解不深,加上没做项目,过段时间就忘记了。这次为了做msPLC系统:一种网络化PLC,需要解决网络通讯,特意引入RTOS实现任务分离,所以把目前资料最为广泛的uCOS与博主自己设计的“实用单片机系统MS5”结合起来,uCOS具备RTOS的多任务,并且资料丰富,MS5博主自己开发的,最为熟悉,并且在单任务下代码简洁,功能齐全,尤其是对时间分割管理、消息机制、界面设计上,都有一定的模式,所以可以理解为基于MS5下,把单任务变成多任务处理,比较完美的结合。
uCOS可以认为是比较标准的一种RTOS,就RTOS来说,它不算复杂,但对于绝大部分只有单任务设计经验的嵌入式人员,已经足够复杂,主要有几点原因:
1、刚接触RTOS思想,对很多名词,功能、变量都不熟悉,这些一多就混淆了
2、文件结构、头文件定义复杂,条件编译、函数指针、结构体过多
3、外围函数过多,任务核心不突出
基于以上三点,本人以普通嵌入式人员的思维,做以下几点精简:
1、去掉一般项目不常用的函数,比如信号量事件(SEM)、开关量事件(MUX)、标记事件(FLAG)、内存管理(MEM),只保留消息邮箱(MBox)和消息队列(MQ)。
2、精简头文件,按常规写法修改,去掉不必要的条件编译
3、去掉统计任务(StatTask)和空闲任务(IdleTask),系统内部精简掉相关的变量,加入MS5,作为它的IdleTask,设置为最低优先级。
4、加入MBox和MQ例子,让其可以在Keil的Debug的UART1窗口下直接调试模拟。
初学者基于精简版本的uCOS,对照书本,学起来应该更容易,起码不会有强烈的排斥心里,在理解了uCOS内核后,再看完整的源码,就非常容易。
msOS今后将基于MS5为基础,引入其他免费公开的RTOS的一些优点,比如FreeRTOS和RT-Thread,形成自己的风格,避免版权,主要超工业自动化方向进化,专注于工业自动化领域。
精简后的uCOSII
uCOS.rar
基于MS5结合uCOS的msOS
msOS.rar