很久很久都没有写博客了,最近真是比赛一个接着一个,都需要参加,所以stm32的学习一直停滞不前,趁着最近准备模块的时间开始着手ucosII的学习, 没办法呀,学习还是要继续的。。 现在开始正式学习,今天的要求不高,只是分析一下移植的时候需要注意的问题,暂且不研究内核代码!(代码移植参照着ST官方源代码) 也就是资源里面名为 取AN-1018.pdf的文档。 代码这里可以下载http://download.csdn.net/detail/king_bingge/5353528 一、uc/OS的实时性是靠什么实现的?
1、uC/OS的实时性就是靠定时中断来完成。 2、每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,运行就绪表中优先级最高的任务(非抢先型内核中断后继续运行被中断任务)。 即过一段时间就检测是否有重要任务需要运行,是的就转而运行更重要的任务,从而确保实时性(裸机程序就无法这样做了)。 当然这里没有把系统调用考虑进去。 二、首先整体把握一下在M3上运行ucosII的架构
这就是整个系统各模块之间的关系,好的接下来就按照手册来分析一下移植的时候需要注意的地方 1、关于OS_CPU.h文件
[csharp] view plain copy
print?
- #ifndef OS_CPU_H
- #define OS_CPU_H
-
-
- #ifdef OS_CPU_GLOBALS
- #define OS_CPU_EXT
- #else
- #define OS_CPU_EXT extern
- #endif
一个全局变量的声明问题
2、类型定义
[csharp] view plain copy
print?
- typedef unsigned char BOOLEAN;
- typedef unsigned char INT8U; /* Unsigned 8 bit quantity */
- typedef signed char INT8S; /* Signed 8 bit quantity */
- typedef unsigned short INT16U; /* Unsigned 16 bit quantity */
- typedef signed short INT16S; /* Signed 16 bit quantity */
- typedef unsigned int INT32U; /* Unsigned 32 bit quantity */
- typedef signed int INT32S; /* Signed 32 bit quantity */
- typedef float FP32; /* Single precision floating point */
- typedef double FP64; /* Double precision floating point */
-
- typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */
- typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */
对于常用的编译器,这些都是没有问题的
3、接下来是两个比较重要的函数,在汇编代码里面
[csharp] view plain copy
print?
- #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
- #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
这两个代码就是进入和退出临界区的两个宏。所以当你使用了这两个宏定义,那么就需要加上这一句OS_CPU_SR cpu_sr = 0; 进行定义并且初始化。
所谓临界区:是指一些不能被中断的代码。哪些代码是不能中断的呢,比如我们模拟的入栈操作,再比如当我们在执行系统调用的时候。那么类似于这钟代码就是临界区,而上面这两个宏的作用就是当某些代码为临界代码的时候,那么我们就在开始这段代码的时候加上ENTER宏,在退出这段代码的时候就加上EXIT宏。 4、接下来继续看看这两个宏做了什么事情吧 跟踪进去可以发现
[csharp] view plain copy
print?
- OS_CPU_SR_Save
- MRS R0, PRIMASK ; Set prio int mask to mask all (except faults)
- CPSID I
- BX LR
-
- OS_CPU_SR_Restore
- MSR PRIMASK, R0
- BX LR
就是我们上一步所说的打开和屏蔽中断,注意了,根据ATCPS规则(不知道的可以百度),C和汇编进行混合调用的时候,R0传递着第一个参数,并且R0还是传递返回值的。
5、接下来就是栈的增长方向,在我们的stm32板子上面,栈是向下增长的,堆是向上增长的
[csharp] view plain copy
print?
- #define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on ARM */
-
- #define OS_TASK_SW() OSCtxSw()
|