当前位置:首页 > 单片机 > 单片机
[导读]代码这里可以下载http://download.csdn.net/detail/king_bingge/5353528一、uc/OS的实时性是靠什么实现的?1、uC/OS的实时性就是靠定时中断来完成。2、每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,

代码这里可以下载http://download.csdn.net/detail/king_bingge/5353528

一、uc/OS的实时性是靠什么实现的?


1、uC/OS的实时性就是靠定时中断来完成。

2、每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,运行就绪表中优先级最高的任务(非抢先型内核中断后继续运行被中断任务)。

即过一段时间就检测是否有重要任务需要运行,是的就转而运行更重要的任务,从而确保实时性(裸机程序就无法这样做了)。

当然这里没有把系统调用考虑进去。

二、首先整体把握一下在M3上运行ucosII的架构


这就是整个系统各模块之间的关系,好的接下来就按照手册来分析一下移植的时候需要注意的地方

1、关于OS_CPU.h文件


#ifndefOS_CPU_H

#defineOS_CPU_H

#ifdefOS_CPU_GLOBALS

#defineOS_CPU_EXT

#else

#defineOS_CPU_EXTextern

#endif


一个全局变量的声明问题


2、类型定义



typedefunsignedcharBOOLEAN;

typedefunsignedcharINT8U;/*Unsigned8bitquantity*/

typedefsignedcharINT8S;/*Signed8bitquantity*/

typedefunsignedshortINT16U;/*Unsigned16bitquantity*/

typedefsignedshortINT16S;/*Signed16bitquantity*/

typedefunsignedintINT32U;/*Unsigned32bitquantity*/

typedefsignedintINT32S;/*Signed32bitquantity*/

typedeffloatFP32;/*Singleprecisionfloatingpoint*/

typedefdoubleFP64;/*Doubleprecisionfloatingpoint*/

typedefunsignedintOS_STK;/*Eachstackentryis32-bitwide*/

typedefunsignedintOS_CPU_SR;/*DefinesizeofCPUstatusregister(PSR=32bits)*/

对于常用的编译器,这些都是没有问题的


3、接下来是两个比较重要的函数,在汇编代码里面



#defineOS_ENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}

#defineOS_EXIT_CRITICAL(){OS_CPU_SR_Restore(cpu_sr);}

这两个代码就是进入和退出临界区的两个宏。所以当你使用了这两个宏定义,那么就需要加上这一句OS_CPU_SR cpu_sr = 0; 进行定义并且初始化。


所谓临界区:是指一些不能被中断的代码。哪些代码是不能中断的呢,比如我们模拟的入栈操作,再比如当我们在执行系统调用的时候。那么类似于这钟代码就是临界区,而上面这两个宏的作用就是当某些代码为临界代码的时候,那么我们就在开始这段代码的时候加上ENTER宏,在退出这段代码的时候就加上EXIT宏。

4、接下来继续看看这两个宏做了什么事情吧

跟踪进去可以发现


OS_CPU_SR_Save

MRSR0,PRIMASK;Setpriointmasktomaskall(exceptfaults)

CPSIDI

BXLR

OS_CPU_SR_Restore

MSRPRIMASK,R0

BXLR


就是我们上一步所说的打开和屏蔽中断,注意了,根据ATCPS规则(不知道的可以百度),C和汇编进行混合调用的时候,R0传递着第一个参数,并且R0还是传递返回值的。


5、接下来就是栈的增长方向,在我们的stm32板子上面,栈是向下增长的,堆是向上增长的


#defineOS_STK_GROWTH1/*StackgrowsfromHIGHtoLOWmemoryonARM*/

#defineOS_TASK_SW()OSCtxSw()


第二个宏定义是任务切换的宏,下面会提到


6、下面涉及到得就是这个文件里面需要修改的代码,首先看源代码,这是函数原型声明



/*

*********************************************************************************************************

*PROTOTYPES

*********************************************************************************************************

*/

#ifOS_CRITICAL_METHOD==3/*SeeOS_CPU_A.ASM*/

OS_CPU_SROS_CPU_SR_Save(void);

voidOS_CPU_SR_Restore(OS_CPU_SRcpu_sr);

#endif

voidOSCtxSw(void);

voidOSIntCtxSw(void);

voidOSStartHighRdy(void);

voidOS_CPU_PendSVHandler(void);

/*SeeOS_CPU_C.C*/

voidOS_CPU_SysTickHandler(void);

void OS_CPU_SysTickInit(void);

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭