步骤如下:
步骤1、从Micrium官方下载相关型号的UCOS-II源代码;
步骤2、新建工程,然后除了添加日常的工程文件外,还需要在工程组里添加四个文件
由这个关系图可知,我们需要在工程里新建的文件夹有
2.1 APP: 用户的外设硬件驱动程序;里面有四个文件:
① app.c //新建的,用户自己编写
②app.h //新建的,用户自己编写
③app_cfg.h //新建的,用户自己编写,用来配置应用软件,主要是任务的优先级、中断优先级和堆栈大小等;
④os_cfg.h // OS本身的对应用软件的配置
2.2 uCOS-II\Source: OS源文件,里面有11个文件,10个C 和1个头文件,来自于Micrium\Software\Ucos-II
2.3 uCOS-II\Ports: OS的CPU端口配置文件,里面有4个文件,两个C,一个头文件,一个汇编文件,来自
2.4 BSP: 用户外设具体的驱动程序,比如说led.c,lcd.c等;至少有两个
①BSP.c
②BSP.h
注意1:从Micrium中拷贝文件过来后,对于PORTS文件夹,去掉只读属性;
注意2:在target 里添加这四个文件夹的编译路径;
步骤3、修改uC/OS-II
3.1 os_cfg.h
用来配置系统功能的,也就是使能或禁用各个功能模块,以及设置相关最小最大值;
①禁用 : 信号量、互斥信号量、邮箱、队列、信号量集、定时器、内存管理,关闭调试模式
②禁用: 应用软件的钩子函数和多重事件控制,如果用不着的话;
#define OS_APP_HOOKS_EN 0
#define OS_EVENT_MULTI_EN 0
3.2 修改os_cpu.h
void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(void);
INT32U OS_CPU_SysTickClkFreq(void);
注释掉前面这三个函数
3.3 修改os_cpu_c.c
用#if 0 … #endif 注释掉三个地方:
①
#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010))
#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))
#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))
#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C))
#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U *)0xE000ED23))
#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000
#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004
#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002
#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001
#define OS_CPU_CM3_NVIC_PRIO_MIN 0xFF
②void OS_CPU_SysTickHandler (void)函数
③void OS_CPU_SysTickInit (void) 函数
3.4 修改os_cpu_a.asm
将原来的 RSEG CODE:CODE:NOROOT(2)
改成:
AREA |.text|, CODE, READONLY, ALIGN=2 ;AREA |.text| 选择段 |.text|。
;CODE表示代码段,READONLY表示只读(缺省)
;ALIGN=2表示4字节对齐。若ALIGN=n,这2^n对齐
THUMB ;Thumb 代码
REQUIRE8 ;指定当前文件要求堆栈八字节对齐
PRESERVE8 ;令指定当前文件保持堆栈八字节对齐
3.5 修改os_dbg.c
由于编译器不同,使用keil时,需要把
#define OS_COMPILER_OPT __root
改成:
#define OS_COMPILER_OPT //__root
3.6 修改启动文件startup_stm32f10x_hd.s
由于我们是使用STM32自带的启动文件,所以需要在这里面设置OS_CPU的嘀嗒定时器中断向量,
因此把PendSV_Handler全部换成OS_CPU_PendSVHandler,一共就三处需要更换的;
步骤4 编写通用的必要文件
4.1 编写includes.h
新建头文件,添加在user文件夹里,然后写入以下代码,所以用户的外设驱动头文件都应该被包含在这里面
#ifndef __INCLUDES_H
#define __INCLUDES_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "uCOS_II.h"
#include "BSP.h" //与开发板相关的函数
#include "app.h"
#include "led.h"
#endif
4.2 编写外设驱动文件 BSP.c 及头文件BSP.h
BSP.c 至少应该包含两个函数
(1) void BSP_Init(void)
{
SystemInit(); /*stystem config as 72MHz*/
LED_GPIO_Config(); /*LED GPIO configuration */
}
(2) void SysTick_init(void)
{
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);
/*初始化并使能SysTick定时器*/
}
头文件BSP.h
#ifndef __BSP_H
#define __BSP_H
void SysTick_init(void);
void BSP_Init(void);
#endif
4.3 修改stm32f10x_it.c
(1)添加头文件:#include "includes.h";
(2)注释掉原来的头文件://#include "stm32f10x_it.h"
(3)在定时中断服务函数里加入以下代码:
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
4.4 编写app_cfg.h 来设置任务优先级和堆栈大小
#ifndef __APP_CFG_H__
#define __APP_CFG_H__
/***************设置任务优先级******************/
#define STARTUP_TASK_PRIO 4
/**********设置栈大小(单位为OS_STK)************/
#define STARTUP_TASK_STK_SIZE 80
#endif
4.5 编写app.c 和app.h 创建用户任务
4.6 编写main.c 主函数
#include "includes.h"
static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE]; //定义栈
int main(void)
{
BSP_Init();
OSInit();
OSTaskCreate(Task_LED,(void*)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
OSStart();
return 0;
}