上个星期突然想做一下ucos在cortex-m0平台上的移植,所以就看cortex-m0的内核架构和指令集,接着就开始着手移植了。先说明一下,我的开发板是新唐(Nuvoton)的NuTiny-EVB M051,芯片是M0516LAN。
可以分两步走。第一步,移植ucos的底层代码。第二步,建立新任务。
第一步:移植ucos就是修改这么几个文件:os_cpu_c.c , os_cpu.h , os_cpu_a.asm
其中,os_cpu.h主要是定义数据类型的定义,和有关处理器的一些设置,如栈的生长方向,进入临界代码段的方式,数据存储的大小端设置等等。
1. os_cpu.h:
1.1 定义好数据类型。这个简单,所以不用怎么说。
1.2 定义进行临界代码段的方式,我定义为方式3。即进入时保存PSR,然后关中断,出来是恢复PSR的值。
对应的函数为:OS_CPU_SR OS_CPU_SR_Save(void), void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
1.3 定义栈的生长方向。我定义为从高向下生长的方向。
1.4 函数的声明。这里有5个函数需要声明。分别是:
void OSCtxSw(void)
void OSIntCtxSw(void)
void OSStartHighRdy(void)
OS_CPU_SR OS_CPU_SR_Save(void)
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
由于OSIntCtxSw和OSCtxSw代码可以一致,所以只定义OSCtxSw。
1.5 具体代码如下:
#ifndef OS_CPU_H #define OS_CPU_H #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif #ifndef OS_CPU_EXCEPT_STK_SIZE #define OS_CPU_EXCEPT_STK_SIZE 1 /* Default exception stack size is 128 OS_STK entries */ #endif 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) */ #define OS_CRITICAL_METHOD 3 #if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} #endif #define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on ARM */ #define OS_TASK_SW() OSCtxSw() #if OS_CRITICAL_METHOD == 3 OS_CPU_SR OS_CPU_SR_Save (void); void OS_CPU_SR_Restore (OS_CPU_SR cpu_sr); #endif void OSCtxSw (void); void OSStartHighRdy (void);
#define OSIntCtxSw() OSCtxSw(); #endif
2. os_cpu_c.c
2.1 定义函数OSTaskStkInit(),对于其它的函数可以不用理,因为如果你不需要用到钩子函数的话,是不用实现的。
OSTaskStkInit()主要初始化各个任务的栈。
2.2 由于cortex-m0的架构决定,当产生异常(包括中断)时,进栈的顺序如下:(这是Full descendi