我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1097|回复: 5

[技术讨论] 新手福利之学习Ucos II移植篇

[复制链接]

该用户从未签到

24

主题

0

回帖

0

积分

一级逆天

积分
0

终身成就奖特殊贡献奖金点子奖原创先锋奖

QQ
发表于 2017-9-8 11:17:45 | 显示全部楼层 |阅读模式
要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求:


1. 处理器的C编译器能产生可重入代码。
2. 用C语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈
5. 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
百度一下“可重入代码”。可重入代码(Reentry code)也叫纯代码(Pure code)是一种允许多个进程同时访问的代码。

Ucos II 是一个可抢占式内核,有这样的要求也是可以理解的。要不这个任务调用了这段代码,它是完整的,等到下一个任务调用它的时候,它就变成残缺的了,下一任务还怎么办?写到这里,不禁想起了少女的第一次.

看上面的要求蛮多的,其实实际应用中是很少有不兼容UCos II 的微处理器的。所以大家可以放心地,大胆地,使劲地,尽情地,淫荡地使用UCos II.

总得来说,移植ucos II 到一个芯片上,只需要修改下面三个文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。

具体来说,移植主要包括以下几项内容
(1).OS_CPU.H :用#define设置一些常量的值,声明10个数据类型,用#define声明三个宏。
(2).OS_CPU_C.C : 用C语言编写六个简单的函数。
(3).OS_CPU_A.ASM : 编写四个汇编语言函数。

乍看起来,移植ucos II的工作量及难度都非常小。但对一个初学者来说,这也不是件轻松的事。它要求对微处理器,汇编和UCoS II 都非常熟悉。
在Mcu21同学的项目里,Mcu21同学极好地发扬了拿来主义精神,直接参照了周立功提供的模板。

我们已经知道移植UCos II,是需要修改三个文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。

下面以移植到lPC2292上为例,理解下移植过程。
(1).首先看OS_CPU.H这个文件
下图是我项目中的OS_CPU.H文件,可以看到,它包括两部分的代码,第一部分是定义与编译器无关的数据类型,第二部分是与ARM7体系结构相关的定义。

为什么要定义数据类型呢?
因为不同的微处理器有不同的字长,所以μC/OS-Ⅱ的移植包括了一系列的类型定义以确保其可移植性。这也是第一部分程序的作用。
程序用有这样的一句
#define OS_STK_GROWTH 1 /* 堆栈是从上往下长的 */

这一句程序有什么作用?
它的作用是定义堆栈方向,绝大多数的微处理器和微控制器的堆栈是从上往下长的。但是某些处理器是用另外一种方式工作的。μC/OS-Ⅱ被设计成两种情况都可以处理,只要在结构常量OS_STK_GROWTH中指定堆栈的生长方式(如下所示)就可以了。置OS_STK_GROWTH为0表示堆栈从下往上长。置OS_STK_GROWTH为1表示堆栈从上往下长。

(2).其次看OS_CPU_C.C这个文件
在这个文件里我们需要编写以下六个函数
OSTaskStkInit()
//初始化任务堆栈结构
OSTaskCreateHook()
//允许用户或使用用户的移植实例的用户扩展μC/OS-Ⅱ的功能
OSTaskDelHook()
//该函数在把任务从μC/OS-Ⅱ的内部任务链表中解开之前被调用
OSTaskSwHook()
//当发生任务切换的时候调用OSTaskSwHook()
OSTaskStatHook()
//用户可以用OSTaskStatHook()来扩展统计功能
OSTimeTickHook()
OSTaskTimeHook()在每个时钟节拍都会被OSTaskTick()调用
事实上,上面的六个函数只有OSTaskStkInit()是必须编写的,而其它的五个函数只需定义就可。
在我的项目里OS_CPU_C.C,也编写了OSTaskStkInit()这个函数。

(3).最后看OS_CPU_A.ASM这个文件
这个文件都是汇编,绝对可以让你看得醉生欲死,欲罢不能,你懂我的。
在OS_CPU_A.ASM这个文件里要求用户编写四个简单的汇编语言函数:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
// OSIntCtxSw()是μC/OS-Ⅱ(和μC/OS)中唯一的与编译器相关的函数
OSTickISR()

编写上面四个函数要求对cpu的工作原理有深入的理解。


以下课程可免费试听C语言、电子、PCB、STM32、Linux、FPGA、JAVA、安卓等。
想学习的你和我联系预约就可以免费听课了。
宋工企鹅号:3524-6590-88   Tel/WX:173--1795--1908
回复

使用道具 举报

该用户从未签到

12

主题

7221

回帖

100

积分

游客

积分
100

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2017-9-8 21:30:00 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 88 天

    [LV.6]常住居民II

    8

    主题

    2429

    回帖

    2273

    积分

    二级逆天

    积分
    2273

    终身成就奖优秀斑竹奖特殊贡献奖

    QQ
    发表于 2017-9-8 21:59:19 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    79

    主题

    316

    回帖

    1308

    积分

    PADS-171101高级班

    积分
    1308

    终身成就奖

    QQ
    发表于 2017-9-9 08:51:48 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6218

    回帖

    8730

    积分

    二级逆天

    积分
    8730

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2017-9-9 09:35:45 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    12

    主题

    1012

    回帖

    394

    积分

    二级逆天

    积分
    394

    社区居民终身成就奖

    QQ
    发表于 2017-9-9 14:57:32 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表