1.从官网上下载UCOS-II源码。到自己的工程路径下新建文件夹UCOS-II。然后将官网上下载的UCOS-II源码的一些文件复制到自己工程的UCOS-II文件夹内。详细如下:
1.1 Source:
| os_core.c
| os: os_flag.c os_mbox.c
| os_mem.c os_mutex.c
| os_q.c os_sem.c
| os_task.c os_time.c
| os_tmr.c
| ucos_ii.c ucos_ii.h
1.2 Ports
| os_cpu_c.c os_cpu.h os_cpu_a.asm
| os_dbg.c os_dbg_r.c
1.3 User
| app_cfg.c app_cfg.h
| os_cfg.h os_cfg_r.h
2. 修剪os_cpu_c.c
2.1 注释掉一些不用的宏
#if 0
#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010uL)) /* SysTick Ctrl & Status Reg. */
#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014uL)) /* SysTick Reload Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018uL)) /* SysTick Current Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01CuL)) /* SysTick Cal Value Reg. */
#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U *)0xE000ED23uL)) /* SysTick Handler Prio Reg. */
#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000uL /* Count flag. */
#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004uL /* Clock Source. */
#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002uL /* Interrupt enable. */
#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001uL /* Counter mode. */
#define OS_CPU_CM3_NVIC_PRIO_MIN 0xFFu /* Min handler prio. */
#endif
2.2 注释掉void OS_CPU_SysTickHandler (void)、void OS_CPU_SysTickInit (INT32U cnts) 这两个函数
/*
*********************************************************************************************************
* OS_CPU_SysTickHandler()
*
* Description: Handle the system tick (SysTick) interrupt, which is used to generate the uC/OS-II tick
* interrupt.
*
* Arguments : none.
*
* Note(s) : 1) This function MUST be placed on entry 15 of the Cortex-M3 vector table.
*********************************************************************************************************
*/
#if 0
void OS_CPU_SysTickHandler (void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}
#endif
/*
*********************************************************************************************************
* OS_CPU_SysTickInit()
*
* Description: Initialize the SysTick.
*
* Arguments : none.
*
* Note(s) : 1) This function MUST be called after OSStart() & after processor initialization.
*********************************************************************************************************
*/
#if 0
void OS_CPU_SysTickInit (void)
{
INT32U cnts;
cnts = OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC;
OS_CPU_CM3_NVIC_ST_RELOAD = (cnts - 1);
/* Set prio of SysTick handler to min prio. */
OS_CPU_CM3_NVIC_PRIO_ST = OS_CPU_CM3_NVIC_PRIO_MIN;
/* Enable timer. */
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC | OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;
/* Enable timer interrupt.
*/
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_INTEN;
}
#endif
3. 修剪os_cpu.h
3.1 注释掉下面几个函数的声明。
#if 0
/* See OS_CPU_C.C */
void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(void);
/* See BSP.C */
INT32U OS_CPU_SysTickClkFreq(void);
#endif
4. 修剪 os_cpu_a.asm。这个是汇编代码。
4.1 将所有的PUBLIC 改为 EXPORT
EXPORT OS_CPU_SR_Save ; Functions declared in this file
EXPORT OS_CPU_SR_Restore
EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
EXPORT OS_CPU_PendSVHandler
4.2
; RSEG CODE:CODE:NOROOT(2)
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
REQUIRE8
PRESERVE8
注:AREA 一点不能顶头写,这是规定,不然回编译出错;
5. 修剪os_dbg.c
5.1把#define OS_COMPILER_OPT __root的宏定义注释掉,如下:
#define OS_COMPILER_OPT //__root
6. 修剪startup_stm32f10x_hd.s
将 PendSV_Handler 替换成 OS_CPU_PendSVHandler
DCD OS_CPU_PendSVHandler ; PendSV Handler(76行)
OS_CPU_PendSVHandler PROC(192行)
EXPORT OS_CPU_PendSVHandler [WEAK]
B .
ENDP
注:这一步很重要,但也是很容易遗漏的步骤。
7. 修剪 stm32f10x_it.c
7.1 加头文件: ucos_ii.h
#include
7.2 修改void SysTick_Handler(void)函数,如下:
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
8. 修剪os_cfg.h
对部分功能进行剪裁;
#define OS_FLAG_EN0
#define OS_MBOX_EN 0
#define OS_MEM_EN 0
#define OS_MUTEX_EN 0
#define OS_Q_EN 0
#define OS_SEM_EN 0
#define OS_TMR_EN 0
#define OS_DEBUG_EN 0
#define OS_APP_HOOKS_EN 0
#define OS_EVENT_MULTI_EN 0
至此,移植方面的工作就完成了。下面是编写点亮LED的代码了。
9. 编写app_cfg.c
#include "includes.h"
#include "app_cfg.h"
#include "task_led.h"
uint8_t error=0;
__align(8) OS_STK led1_task_stk[LED1_TASK_STK_SIZE]; //LEDÈÎÎñÕ»
void Task_Start(void *p_arg)
{
(void)p_arg; //
OSStatInit();
OSTaskCreate(task_led1,(void *)0,&led1_task_stk[LED1_TASK_STK_SIZE-1], LED1_TASK_PRIO);
OSTaskDel(STARTUP_TASK_PRIO);
}
10. 编写app_cfg,h
#ifndef __APP_CFG_H__
#define __APP_CFG_H__
#include "includes.h"
#include "uCOS_II.h"
/*******************ÉèÖÃÈÎÎñÓÅÏȼ¶*******************/
#define STARTUP_TASK_PRIO 4
#define AVOID_OBSTACLE_TASK_PRIO 5
#define LED1_TASK_PRIO 6
/************ÉèÖÃÕ»´óС£¨µ¥Î»Îª OS_STK £©************/
#define STARTUP_TASK_STK_SIZE 128
#define LED1_TASK_STK_SIZE 128
extern unsigned char error;
void Task_Start(void *p_arg);
#endif
11. 编写main.c
#include "stm32f10x.h"
#include "Includes.h"
#include
#include "ucos_ii.h"
#include "task_led.h"
OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
int main(void)
{
SystemInit();
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);
if (SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC))
{
/* Capture error */
while (1);
}
led_gpio_init();
OSInit();
OSTaskCreate(Task_Start,(void *)0,
&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);
OSStart();
return 0;
}
12 编写task_led.c
#include "task_led.h"
#include "Includes.h"
#include "Bsp_Led.h"
void task_led1(void *p_arg)
{
(void)p_arg;
OSTimeDlyHMSM(0, 0,3,0);
while (1)
{
OSTimeDlyHMSM(0, 0,1,0);
Bsp_Led_on_off(LED3, ON ); // ÁÁ
OSTimeDlyHMSM(0, 0,1,0);
Bsp_Led_on_off(LED3, OFF ); // Ãð
}
}
13.task_led.h
#ifndef __TASK_LED_H__
#define __TASK_LED_H__
#include "includes.h"
#include "stm32f10x.h"
#include "ucos_ii.h"
void task_led1(void *p_arg);
#endif
14. Bsp_Led.c
#include "Includes.h"
#include "Bsp_Led.h"
void led_gpio_init(void)
{
GPIO_InitTypeDef GPIO_Init_Param;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOF, ENABLE);
GPIO_Init_Param.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_Init_Param.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init_Param.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Init_Param);
GPIO_SetBits(GPIOC,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
//GPIO_ResetBits(GPIOC,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
int Bsp_Led_on_off(int led_number,int on_off)
{
int ret = 0;
switch(led_number) {
case 0:
if(ON == on_off) {
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
}else {
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
break;
case 1:
if(ON == on_off) {
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
}else {
GPIO_SetBits(GPIOC,GPIO_Pin_1);
}
break;
case 2:
if(ON == on_off) {
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
}else {
GPIO_SetBits(GPIOC,GPIO_Pin_2);
}
break;
case 3:
if(ON == on_off) {
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
}else {
GPIO_SetBits(GPIOC,GPIO_Pin_3);
}
break;
default:
ret = 1;
}
return ret;
}
15. Bsp_Led.h
#ifndef __LED__H
#define __LED__H
#define ON 0
#define OFF 1
#define LED0 0
#define LED1 1
#define LED2 2
#define LED3 3
int Bsp_Led_on_off(int led_number,int on_off);
void led_gpio_init(void);
#endif
至此,一个完整的点亮LED的UCOS-II工程就完成了。