工作很久了,一直在用ucosIII,以前移植过ucosII,也看过别人写的教程移植过ucosIII,但是一直想自己移植一下ucosIII,然后把自己的移植体会写出来.供大家一起学习.
移植环境:iar6.0, stm32lib_v3.5, ucosIII.
获取stm32库文件v3.5.地址: http://448251593.qjwm.com/down_6273773.html
获取ucosIII的源码. 地址: http://448251593.qjwm.com/down_6273751.html
当然如果你有这些源码就不用下载了.
这是一个.exe的文件.需要运行解压到指定的目录.(我解压到C盘,默认),如下图:
二、建立一个最简单的gpio工程
在D盘(可按需)建立一个stm32_ucosIII的目录,然后在其里面建立一个App目录 ,将STM32 v3.5固件库…\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle下面的文件都拷贝到App下面
然后把stm32的库拷贝到stm32_ucosIII目录
打开IAR软件Project->Create New Project
然后按照下图建立分组
然后添加源文件如下图
下面就是设置IAR工程参数了
这里可能会出现错误, 这个错误说的是没有指定一款芯片
双击错误定位到错误的位置,然后找到第65行.你会发现有芯片定义但是全部是注释状态根据你的芯片的容量打开一个注释.
在编译一次OK.一个错误都没有.进入main.c文件主函数吧里面的内容都删除掉,只剩下一个while(1),以备后面移植ucosIII使用
先把systick这个内核定时器配置好吧.这个是ucos的心跳.我们在main函数里面加上两句程序用于初始化systick的.systick定时具体的寄存器请参照stm32 的数据手册
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_Config(9000);/*配置systick周期1ms*/
打开stm32f10x_it.c文件的139行在里面添加几条空语句,设置一个断点.仿真运行看systick是否工作
运行效果如下图
三、移植ucosIII
现在我们开始正式移植ucosIII,打开我们的工程目录,按照下图操作,
然后把源码包里面的BSP目录下面的bsp.c和bsp.h两个文件copy到我们新建的Bsp目录下
现在源文件都搞定了.就差添加到工程里面了,回到IAR建立相应分组具体看下图
然后添加文件
添加完所有的文件,然后打开IAR工程选项设置路径,以下是新增加的文件夹路径
$PROJ_DIR$\Bsp
$PROJ_DIR$\uC-CPU
$PROJ_DIR$\uC-CPU\Cfg\Template
$PROJ_DIR$\uC-CPU\ARM-Cortex-M3\IAR
$PROJ_DIR$\uC-LIB
$PROJ_DIR$\uC-LIB\Cfg\Template
$PROJ_DIR$\uCOS-III\Cfg\Template
$PROJ_DIR$\uCOS-III\Ports\ARM-Cortex-M3\Generic\IAR
$PROJ_DIR$\uCOS-III\Source
现在开始修改文件,进入bsp.c文件163行,把BSP_Init()函数内容都删除掉
然后在头文件的位置加入#include "stm32f10x.h"
进入stm32f10x_it.c文件130行把PendSV_Handler()函数屏蔽掉139行把SysTick_Handler()函数也屏蔽掉
接下来进入os_cpu_c.c文件355行把函数名修改为SysTick_Handler
然后进入os_cpu.h文件133行两个函数名修改
void PendSV_Handler (void);
void SysTick_Handler(void);
接下来进入os_cpu_a.asm文件38行和133行改为PendSV_Handler
至此移植算是告一段落.编译一下.
会出现错误提示不能打开头文件
这个是app应用层的的所以我们双击错误定位到错误位置把这句删除即可
错误时不能打开os_type.h文件所以我们去ucosIII的源码目录下找到这个文件拷贝到我们的工程目录下的App下
进入cpu_cfg.h文件99行.改为DEF_ENABLED
移除lib_mem_a.asm文件
接下来再次编译此时只剩下2个警告.
四、测试OS
打开main.c文件
在24行添加
#include "os.h"
37行添加
CPU_STK AppTaskStk[128];
OS_TCB AppTaskTCB;
void AppTask(void *p_arg);
main()函数添加
OS_ERR err;
CPU_IntDis();
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);/*配置systick的时钟源为hclk8分频*/
SysTick_Config(9000); /*配置systick的时钟周期1ms*/
OSInit(&err); /*初始化OS*/
OSTaskCreate((OS_TCB *)&AppTaskTCB, /* Create the task */
(CPU_CHAR *)"App Task",
(OS_TASK_PTR )AppTask,
(void *)0,
(OS_PRIO )12,
(CPU_STK *)&AppTaskStk[0],
(CPU_STK_SIZE)128/10,
(CPU_STK_SIZE)128,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,
(OS_ERR *)&err);
OSStart(&err); /*启动OS*/
然后在加入任务函数原形
/**
* @brief Main program.
* @param None
* @retval None
*/
void AppTask(void *p_arg)
{
OS_ERR err;
static char t = 0;
while(1)
{
if (t)
{
t = 0;
asm("nop");
OSTimeDly(200, OS_OPT_TIME_DLY, &err);
}
else
{
t = 1;
asm("nop");
asm("nop");
asm("nop");
OSTimeDly(100, OS_OPT_TIME_DLY, &err);
}
}
}
以上便完成了ucosIII的移植具体可以下载word文档.图片好多上传很费劲