Keil uCos 2.52 stm32 【worldsing笔记】
1、uCOSii V2.52
a、加了7个可以配置的钩子函数宏
#define OS_TASK_CREATE_HOOK_EN 0 /* 任务创建时调用钩子函数 使能 1 / 禁止 0 */
#define OS_TASK_STAT_HOOK_EN 0 /* 统计任务运行时调用钩子函数 使能 1 / 禁止 0 */
#define OS_TASK_SW_HOOK_EN 1 /* 任务调度时调用钩子函数 使能 1 / 禁止 0 */
#define OS_TIME_TICK_HOOK_EN 1 /* 滴答中断时调用钩子函数 使能 1 / 禁止 0 */
#define OS_TCB_INIT_HOOK_EN 0 /* TCB初始化时调用钩子函数 使能 1 / 禁止 0 */
#define OS_TASK_IDLE_HOOK_EN 0 /* 统计任务运行时调用钩子函数 使能 1 / 禁止 0 */
#define OS_INIT_BEGIN_HOOK_EN 0 /* OS初始化开始时调用钩子函数 使能 1 / 禁止 0 */
#define OS_INIT_END_HOOK_EN 0 /* OS初始化结束时调用钩子函数 使能 1 / 禁止 0 */
b、加了创建任务是自动分配栈接口OSSetupTask和宏,也可以用原生的OSTaskCreate(),OSSetupTask(任务名, 优先级);
#define OS_TASK_AUTO_STK_SIZE 128 /* 默认用户任务栈大小 单位类型:OS_STK */
#define OS_MAX_TASK_AUTO_STK 2 /* 使用默认栈的任务数,0 不使用,必须小于等于 OS_MAX_TASKS */
/* 使用默认分配栈,每个栈大小都是OS_TASK_STK_SIZE */
OS_MAX_TASK_AUTO_STK 定义为0要自行定按照uCos标准接口写应用代码;
c、应用程序无需定义main(),无需对SysTick初始化(在OS_CPU_C.c中完成),定义MainTask即可
void MainTask (void *pArg)
{
//这里放入板子硬件初始化代码
//创建其他任务
OSSetupTask(Task0, 2);
while(1)
{
OSTimeDly(100);
pArg = pArg;
}
}
d、系统默认开启任务调度时调用钩子函数和滴答中断时调用钩子函数
当LED在任务正常调度时以10:90 个Tick闪烁
当LED在任务非正常调度时以1:1 个Tick闪烁
#define LED_GPIO GPIOE /*LED IO口 */
#define LED_GPIO_PIN GPIO_Pin_12 /*LED IO口引脚号 */
#define LED_GPIO_CLK RCC_APB2Periph_GPIOE /*LED IO时钟名 */
#define LED_ON() LED_GPIO->ODR &= ~LED_GPIO_PIN /*LED开 低电平 */
#define LED_OFF() LED_GPIO->ODR |= LED_GPIO_PIN /*LED开 高电平 */
#define LED_REV() RevBit(LED_GPIO->ODR, 12) /*LED 状态反转 */
2、stm32 Lib V3.5
a.startup_stm32f10x_md.s 把默认的软件中断和定时器中断名改为: OS_CPU_PendSVHandler 和 OS_CPU_SysTickHandler
b、stm32f10x.h库检测关闭,定义为:#define assert_param(a)
3、在工程设置选项卡C/C++ 定义cpu类型 STM32F10X_MD
4、测试环境Keil MDK 4.7a stm32f103vb
应用Demo:
#include "includes.h"
void Task0 (void *pArg);
/* 主任务
*/
void MainTask (void *pArg)
{
OSSetupTask(Task0, 2);
while(1)
{
OSTimeDly(100);
pArg = pArg;
}
}
/* 其他任务
*/
void Task0 (void *pArg)
{
int cnt;
cnt = 0;
while(1)
{
OSTimeDly(10);
pArg = pArg;
cnt++;
if(cnt == 100)
while(1);
}
}
源码下载:点击下载