基于Cortex-M0的UCOS移植

本文详细介绍了如何在Cortex-M0微控制器(以新唐NuTiny-EVB M051开发板为例)上移植UCOS操作系统。首先,通过修改os_cpu_c.c、os_cpu.h和os_cpu_a.asm文件来完成底层代码移植,定义数据类型、临界区管理、栈生长方向等。接着,初始化任务栈并设置异常进栈顺序。最后,在main函数中创建任务,并使用SysTick作为系统节拍源。经过这些步骤,成功地在Cortex-M0上运行了UCOS并创建了闪烁LED任务。
摘要由CSDN通过智能技术生成

上个星期突然想做一下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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值