完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。通常把程序分为两部分:前台系统和后台系统。
简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。 本文讲解如何在STM32F103开发板上移植UCOS II操作系统。 使用:战舰开发板V3,ST-LINK,KEIL,sscom 准备工作: 1、ucos II源码,可以在官网下载,也可以通过在文章末尾打包好的各种文件下载。 下载的源码文档中有两个文件夹Doc、Source,源码主要包含在Source中。 2、准备跑马灯工程,同上也可以在文章末尾下载。 3、在工程中新建UCOSII文件夹,在其中新建CORE,CONFIG、PORT三个文件夹备用。 4、向文件夹中添加文件 向CORE文件夹中添加UCOS II源码Source文件夹下的文件,注意os_cfg.h和os_dbg_r.c这两个文件不要添加,共12个 向CONFIG文件夹中添加includes.h和os_cfg.h这两个文件(一并放在打包文件里)includes.h文件中主要包含的是头文件,os_cfg.h文件主要是对UCOS II进行了裁剪。 向PORT文件夹添加os_cpu.h、os_cpu_a.asm、os_cpu_c.c、os_dbg.c和os_dgb_r.c(一并放在打包文件里) 5、将UCOSII有关的文件添加到工程中 向分组UCOSII-CORE中添加CORE文件夹下除ucosii.c外的所有.c文件; 向分组UCOSII-PORT中添加PORT文件夹下的os_cpu.h、os_cpu_a.asm、os_cpu_c.c; 向分组UCOSII-CONFIG中添加CONFIG文件夹下的includes.h和os_cfg_.h 添加过程中选择All files文件查找 添加完如图 最后添加相关的头文件路径 6、编译会出错,打不开app_cfg.h头文件,可追踪到ucos_ii.h文件中,将这个头文件屏蔽掉,添加includes.h头文件。 再编译会出错,重定义了PendSV_Handler这个中断函数,我们将STM32F10x_it.o中的这个函数屏蔽掉。 7、修改sys.h头文件,里面有一个SYSTEM_SUPPORT_UCOS宏定义,改为1支持UCOS系统。再编译工程会出错,重定义了SysTick_Handler这个中断函数,同上将STM32F10x_it.o中的这个函数屏蔽掉。 8、软件设计,main函数中建立三个任务简单测试,建立start_task任务创建其他三个任务。 #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "includes.h" //START 任务 //设置优先级 #define START_TASK_PRIO 10 //开始任务的优先级设为最低 //设置任务堆栈大小 #define START_STK_SIZE 128 //任务堆栈 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); //LED0任务 //设置任务优先级 #define LED0_TASK_PRIO 7 //设置任务堆栈大小 #define LED0_STK_SIZE 64 //任务堆栈 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; //任务函数 void led0_task(void *pdata); //LED1任务 //设置任务优先级 #define LED1_TASK_PRIO 6 //设置任务堆栈大小 #define LED1_STK_SIZE 128 //任务堆栈 OS_STK LED1_TASK_STK[LED1_STK_SIZE]; //任务函数 void led1_task(void *pdata); //浮点测试任务 //设置任务优先级 #define FLOAT_TASK_PRIO 5 //设置任务堆栈大小 #define FLOAT_STK_SIZE 128 //任务堆栈 //如果任务中使用printf来打印浮点数据的话要8个字节对齐 __align(8)OS_STK FLOAT_TASK_STK[FLOAT_STK_SIZE]; //任务函数 void float_task(void *pdata); int main(void) { delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置 uart_init(115200); LED_Init(); OSInit(); //UCOS初始化 OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//创建开始任务 OSStart(); //开始任务 } //开始任务 void start_task(void*pdata) { OS_CPU_SR cpu_sr=0; pdata=pdata; OSStatInit(); //开启统计任务 OS_ENTER_CRITICAL(); //进入临界区(关闭中断) //创建LED0任务 OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); //创建LED1任务 OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); //创建浮点测试任务 OSTaskCreate(float_task,(void*)0,(OS_STK*)&FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //挂起开始任务 OS_EXIT_CRITICAL(); //退出临界区(开中断) } //LED0任务 void led0_task(void*pdata) { while(1) { LED0=0; delay_ms(80); LED0=1; delay_ms(400); } } //LED1任务 void led1_task(void*pdata) { while(1) { LED1=0; delay_ms(300); LED1=1; delay_ms(300); } } //浮点测试任务 void float_task(void*pdata) { OS_CPU_SR cpu_sr=0; static float float_num=0.01; while(1) { float_num+=0.01f; OS_ENTER_CRITICAL(); //进入临界区(关闭中断) printf("float_num的值为:%.4frn",float_num); //串口打印结果 OS_EXIT_CRITICAL(); //退出临界区(开中断) delay_ms(500); } } 9、程序说明,在main函数中共建立了4个任务:start_task、led0_task、led1_task和float_task。 start_task用于创建其他3个任务,当创建完其他三个任务后就会挂起; led0_task、led1_task两个任务让LED闪烁; float_task用于测试FPU能否正常使用,每隔500ms给float_num 加0.01,然后串口打印出来。 10、ST_Link 下载验证,串口助手输出显示是否正常。UCOSII移植完成。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1537 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1490 浏览 1 评论
910 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
654 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1538 浏览 2 评论
1845浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
596浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
499浏览 3评论
499浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
483浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 15:24 , Processed in 0.926763 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号