本帖最后由 star_66666 于 2016-12-16 00:14 编辑
ucosii可以说是前些年对流行的rtos系统,笔者从10年前入行,就开始接触ucosii,
第一次接触时,很茫然,不知所措,到处买书看,找例程参考,还是不会,很无奈。
就这样1年多过去了,还是不会,反正工作中也不需要,就没再继续学。
直到接触了2年后,因项目需要,不得不又提上日程。再次开始学习。
其实也很简单,只要真正开始动手了,发现,还是不太男的,有点像人妖了,再继续,就变成美女了
那就简单说说ucos,当然这部分内容网上很多,不多说。
首先去ucos的官网下载ucosii
其次,就是添加ucos的代码进入系统
|core: 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
|o s_tmr.c
|head: ucos_ii.h
理论上这几个文件我们完全不用修改!但是,他依赖外部的一些头文件;
app_cfg.h //应用程序的一些功能,目测这里是不需要的;但是他已经写了,那我们就保留吧;所以我们就要先建立一个空的app_cfg.h文件
os_cfg.h //做一些os功能的开关,我们可以由此来对系统进行一些裁剪;保留我们需要的功能;
os_cpu.h //为了适应os,我们必须把os与cpu之间建立一个桥梁;就是通过os_port来进行建立的;
再次就是修改startup_stm32f769xx.s文件
PendSV_Handler ; PendSV Handler
SysTick_Handler ; SysTick Handler
把这2个函数的名字统一
第四就是配置
os_cfg.h 里面的功能
第五就可以开始正式的新建任务了,
//LED0任务
void led0_task(void *pdata)
{
while(1)
{
GPIOJ->BSRR=(1 << 5) << 16;
delay_ms(80);
GPIOJ->BSRR=1 << 5;
delay_ms(920);
};
}
//LED1任务
void led1_task(void *pdata)
{
while(1)
{
GPIOJ->BSRR=(1 << 13) << 16;
delay_ms(300);
GPIOJ->BSRR=1 << 13;
delay_ms(300);
};
}
在主函数增加如下的调度即可运行
//LED0任务
OSTaskCreateExt((void(*)(void*) )led0_task,
(void* )0,
(OS_STK* )&LED0_TASK_STK[LED0_STK_SIZE-1],
(INT8U )LED0_TASK_PRIO,
(INT16U )LED0_TASK_PRIO,
(OS_STK* )&LED0_TASK_STK[0],
(INT32U )LED0_STK_SIZE,
(void* )0,
(INT16U )OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR|OS_TASK_OPT_SAVE_FP);
//LED1任务
OSTaskCreateExt((void(*)(void*) )led1_task,
(void* )0,
(OS_STK* )&LED1_TASK_STK[LED1_STK_SIZE-1],
(INT8U )LED1_TASK_PRIO,
(INT16U )LED1_TASK_PRIO,
(OS_STK* )&LED1_TASK_STK[0],
(INT32U )LED1_STK_SIZE,
(void* )0,
(INT16U )OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR|OS_TASK_OPT_SAVE_FP);
笔者也是做了个简单的例程,LED亮灭,2个led,2个任务,简单的任务调度,希望给刚入门的兄弟们有个引导。
下图是下载固件后的效果图
下面是视频是实际效果
点击此处,查看STM32F769I开发板官方资源。