我根据上一篇我转载的博客,整理了一下内容。精简了一下
当已经建立好了一个普通的工程时,例如一个led亮灯工程,且能正常运行的情况下。如何加入ucosii?
1 下载好ucosii官方代码
你的 工程加入文件 ports和source和它的包含的文件
将os_cpu_c.h文件中的最后的三个函数void OS_CPU_SysTickHandler(void);void OS_CPU_SysTickInit(void);INT32U OS_CPU_SysTickClkFreq(void);注释掉
2 在启动文件中,用OS_CPU_PendSVHandler把所有出现PendSV_Handler的地方替换掉
至于OS_CPU_SysTickHandler,采用的方法是自己重新写一个(现在不管它),避免对启动文件的修改
3 在include目录下建立一个新的app_cfg.h文件,
拷贝Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD目录下的os_cfg.h到include目录下,将这两个文件添加到工程中。
修改os_cfg.h中的#define OS_APP_HOOKS_EN 0
#define OS_DEBUG_EN 0
#define OS_EVENT_MULTI_EN 0
#define OS_SCHED_LOCK_EN 0
#define OS_TICK_STEP_EN 0
#define OS_TASK_CHANGE_PRIO_EN 0
#define OS_TASK_QUERY_EN 0
#define OS_TASK_STAT_EN 0
#define OS_TASK_STAT_STK_CHK_EN 0
#define OS_TASK_SUSPEND_EN 0
#define OS_FLAG_EN 0
#define OS_MBOX_EN 0
#define OS_TIME_DLY_HMSM_EN 0
#define OS_TIME_DLY_RESUME_EN 0
#define OS_TIME_GET_SET_EN 0
#define OS_TIME_TICK_HOOK_EN 0
编写app_cfg.h
#ifndef _APP_CFG_
#define _APP_CFG_
#define OS_TASK_TMR_PRIO 3
/* task priority */
#define STARTUP_TASK_PRIO 6
/* task stack size */
#define STARTUP_TASK_STK_SIZE 80
#define Task1_Stk_Size 64
#define Task1_Prio 11
#endif
4 编写系统SysTick中断和任务:
工程里加入stm32f10x_it.c文件
在stm32f10x_it.c中添加SysTick中断处理函数和#include "ucos_ii.h"
void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit();
}
5
main.c
#include "ucos_ii.h"
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
static OS_STK Task1_stk[Task1_Stk_Size];
static void Task1(void *p_arg)
{
for (;;)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
OSTimeDly(500);
GPIO_SetBits(GPIOF,GPIO_Pin_8);
OSTimeDly(500);
}
}
static void systick_init(void)
{
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);
}
int main(void)
{
RCC_Configuration_t();
GPIO_Config();
systick_init();
OSInit();
OSTaskCreate(Task1, (void *)0,&Task1_stk[Task1_Stk_Size-1], Task1_Prio);
OSStart();
return 0;
}