移植 msOS_V0.11_20150807 到 Nu-LB-NUC140

移植 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

ucos 官方网站

https://www.micrium.com/forums/topic/ucos-and-micropython/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值