STM32移植uC/OS-II记录
#STM32移植uC/OS-II
标签(空格分隔): ARM uC/OS-II
---
##移植前相关知识介绍
###目标板与uC/OS-II的系统框架图
![](//images0.cnblogs.com/blog/665192/201408/301617582511830.jpg)
###搭建文件结构
![](//images0.cnblogs.com/blog/665192/201408/301619070633006.png)
###配置uC/OS-II
- 修改os_cfg.h
禁用信号量、互质信号量、邮箱、队列、信号量集、定时器、内存管理、关闭调试模式、应用软件的钩子函数与多重事件的控制
```cpp
#define OS_APP_HOOKS_EN 0
#define OS_DEBUG_EN 0 /* Enable(1) debug variables*/
#define OS_FLAG_EN 0 /* Enable (1) or Disable (0) code generation for EVENT FLAGS */
#define OS_MBOX_EN 0 /* Enable (1) or Disable (0) code generation for MAILBOXES */
#define OS_MEM_EN 0 /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
#define OS_MUTEX_EN 0 /* Enable (1) or Disable (0) code generation for MUTEX */
#define OS_Q_EN 0 /* Enable (1) or Disable (0) code generation for QUEUES */
#define OS_SEM_EN 0 /* Enable (1) or Disable (0) code generation for SEMAPHORES */
#define OS_TMR_EN 0 /* Enable (1) or Disable (0) code generation for TIMERS */
```
$目的:减少内核体积,便于调试$
- 修改os_cpu_c.c
- 修改os_cpu.h
- 修改os_cpu_a.asm
- 修改startup_stm32f10x_hd.s
###一个完整的uC/OS-II的应用核心文件
**main.c**
```cpp
OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE]; //定义栈
int main(void)
{
BSP_Init();
OSInit();
OSTaskCreate(Task_Start,(void *)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);
OSStart();
return 0;
}
```
**BSP.c**
* 函数名:BSP_Init
* 描述 :时钟初始化、硬件初始化
```cpp
void BSP_Init(void)
{
SystemInit(); /* 配置系统时钟为72M */
SysTick_init(); /* 初始化并使能SysTick定时器 */
LED_GPIO_Config(); /* LED 端口初始化 */
}
```
**app.c**
定义三个任务
- 主任务 **Task_Start**
- 任务2 **Task_Led2**
- 任务3 **Task_led3**
```
OS_STK task_led2_stk[TASK_LED2_STK_SIZE]; //定义栈
OS_STK task_led3_stk[TASK_LED3_STK_SIZE]; //定义栈
//主任务
void Task_Start(void *p_arg)
{
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警
OSTaskCreate(Task_LED2,(void *)0, //创建任务2
&task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);
OSTaskCreate(Task_LED3,(void *)0, //创建任务3
&task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);
while (1)
{
LED1( ON );
OSTimeDlyHMSM(0, 0,0,100);
LED1( OFF);
OSTimeDlyHMSM(0, 0,0,100);
}
}
//任务2
void Task_LED2(void *p_arg)
{
(void)p_arg;
while (1)
{
LED2( ON );
OSTimeDlyHMSM(0, 0,0,200);
LED2( OFF);
OSTimeDlyHMSM(0, 0,0,200);
}
}
//任务3
void Task_LED3(void *p_arg)
{
(void)p_arg;
while (1)
{
LED3( ON );
OSTimeDlyHMSM(0, 0,0,300);
LED3( OFF);
OSTimeDlyHMSM(0, 0,0,300);
}
}
```
###整体运行流程
![](//images0.cnblogs.com/blog/665192/201408/301618096415648.jpg)
待续...