论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 968阅读
  • 5回复

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

上一主题 下一主题
离线嵌入式11
 

性别:
人妖
发帖
24
金币
5
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2017-09-08
要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求: -Nr*na^H9#  
XcbEh  
5-4  
1. 处理器的C编译器能产生可重入代码。 4{,!'NA  
2. 用C语言就可以打开和关闭中断。 Yi-,Pb?   
3. 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。 auB+g'l  
4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈 uEsF 8  
5. 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。 KsTE)@ F:  
百度一下“可重入代码”。可重入代码(Reentry code)也叫纯代码(Pure code)是一种允许多个进程同时访问的代码。 3W[||V[r]<  
}V/iU_)  
Ucos II 是一个可抢占式内核,有这样的要求也是可以理解的。要不这个任务调用了这段代码,它是完整的,等到下一个任务调用它的时候,它就变成残缺的了,下一任务还怎么办?写到这里,不禁想起了少女的第一次. W T @XHwt  
;<MHl[jJD  
看上面的要求蛮多的,其实实际应用中是很少有不兼容UCos II 的微处理器的。所以大家可以放心地,大胆地,使劲地,尽情地,淫荡地使用UCos II. 3?k<e  
9qq6P!  
总得来说,移植ucos II 到一个芯片上,只需要修改下面三个文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。 ra ,.vJuT  
!;t6\Z8&  
具体来说,移植主要包括以下几项内容 [IyC}lSW^-  
(1).OS_CPU.H :用#define设置一些常量的值,声明10个数据类型,用#define声明三个宏。 c r18`xU  
(2).OS_CPU_C.C : 用C语言编写六个简单的函数。 p=[I;U-#H  
(3).OS_CPU_A.ASM : 编写四个汇编语言函数。 6 {`J I  
OgK' ~j  
乍看起来,移植ucos II的工作量及难度都非常小。但对一个初学者来说,这也不是件轻松的事。它要求对微处理器,汇编和UCoS II 都非常熟悉。 TCgW^iu  
在Mcu21同学的项目里,Mcu21同学极好地发扬了拿来主义精神,直接参照了周立功提供的模板。 XB[EJGaX  
zGL.+@  
我们已经知道移植UCos II,是需要修改三个文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。 juWbd|ad"  
Eg4&D4TG p  
下面以移植到lPC2292上为例,理解下移植过程。 tI0D{Xrc  
(1).首先看OS_CPU.H这个文件 dF&@q,  
下图是我项目中的OS_CPU.H文件,可以看到,它包括两部分的代码,第一部分是定义与编译器无关的数据类型,第二部分是与ARM7体系结构相关的定义。 "-HWw?rx/  
P-Gp^JX8  
为什么要定义数据类型呢? oB<!U%BN  
因为不同的微处理器有不同的字长,所以μC/OS-Ⅱ的移植包括了一系列的类型定义以确保其可移植性。这也是第一部分程序的作用。 H.Z<T{y;  
程序用有这样的一句 X2 <fS~m  
#define OS_STK_GROWTH 1 /* 堆栈是从上往下长的 */ l?X)]1  
)|]*"yf:E  
这一句程序有什么作用? 9+Wf*:*EW  
它的作用是定义堆栈方向,绝大多数的微处理器和微控制器的堆栈是从上往下长的。但是某些处理器是用另外一种方式工作的。μC/OS-Ⅱ被设计成两种情况都可以处理,只要在结构常量OS_STK_GROWTH中指定堆栈的生长方式(如下所示)就可以了。置OS_STK_GROWTH为0表示堆栈从下往上长。置OS_STK_GROWTH为1表示堆栈从上往下长。 eS%8WmCV9<  
HbCcROl(  
(2).其次看OS_CPU_C.C这个文件 i\>?b)a>  
在这个文件里我们需要编写以下六个函数 v# fny  
OSTaskStkInit() $F/xv&t  
//初始化任务堆栈结构 @E> rqI;`  
OSTaskCreateHook() hBDmC_\~  
//允许用户或使用用户的移植实例的用户扩展μC/OS-Ⅱ的功能 7$Cv=8  
OSTaskDelHook() DRVvC~M-,  
//该函数在把任务从μC/OS-Ⅱ的内部任务链表中解开之前被调用 d|sf2   
OSTaskSwHook() Nc^:v/(P  
//当发生任务切换的时候调用OSTaskSwHook() #A~7rH%hi  
OSTaskStatHook() JGYJ;j{E]  
//用户可以用OSTaskStatHook()来扩展统计功能 !Ks<%; rb  
OSTimeTickHook() |lIgvHgg  
OSTaskTimeHook()在每个时钟节拍都会被OSTaskTick()调用 kb\\F:w(W  
事实上,上面的六个函数只有OSTaskStkInit()是必须编写的,而其它的五个函数只需定义就可。 (s51GRC  
在我的项目里OS_CPU_C.C,也编写了OSTaskStkInit()这个函数。 Eh *u6K)Z  
F:Yp1Wrb<  
(3).最后看OS_CPU_A.ASM这个文件 }'p*C$  
这个文件都是汇编,绝对可以让你看得醉生欲死,欲罢不能,你懂我的。 0Fs2* FS  
在OS_CPU_A.ASM这个文件里要求用户编写四个简单的汇编语言函数: F\<{:wu   
OSStartHighRdy() GCrsf  
OSCtxSw() cVaGgP}\  
OSIntCtxSw() {P==6/<2o  
// OSIntCtxSw()是μC/OS-Ⅱ(和μC/OS)中唯一的与编译器相关的函数 $%1oZ{&M  
OSTickISR() Xk:_aJ  
t&o&gb  
编写上面四个函数要求对cpu的工作原理有深入的理解。 P(p|NRD@1  
Tog'3k9Uw  
"!#KQ''R  
以下课程可免费试听C语言、电子PCBSTM32、Linux、FPGA、JAVA、安卓等。 ZQsVSz( 1  
学习的你和我联系预约就可以免费听课了。 dFk$rr>q  
宋工企鹅号:3524-6590-88   Tel/WX:173--1795--1908 ^HWa owy=  
|4Os_*tRKU  


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线地沟油

性别:
人妖
发帖
7241
金币
4361
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2017-09-08
    


离线kenxjy

性别:
帅哥
发帖
2304
金币
2155
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2017-09-08


离线pickup

性别:
人妖
发帖
395
金币
852
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2017-09-09
C语言、电子、PCB、STM32、Linux、FPGA、JAVA、安卓等   BZ1wE1t  
IBo  
全能人才呀。


离线sun5304

性别:
帅哥
发帖
6244
金币
8073
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 2017-09-09
全能人


离线eyangbo

性别:
帅哥
发帖
1026
金币
570
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 5楼 发表于: 2017-09-09
          


快速回复
限150 字节
 
上一个 下一个