UCOS II移植到STM32F103开发板
发布日期:2021-07-26 18:44:28
浏览次数:46
分类:技术文章
本文共 3519 字,大约阅读时间需要 11 分钟。
早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用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的值为:%.4f\r\n",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移植完成。10、打包好的资源下载:
连接: 如果连接失效请留言,看到后及时处理!转载地址:https://blog.csdn.net/qq_41877422/article/details/86089175 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月06日 04时48分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Android】 Intent应用详解
2019-04-26
【Android】 Intent详解
2019-04-26
【Android】 常用的Intent
2019-04-26
Android中AsyncTask的简单用法
2019-04-26
【Android】 Android中Log调试详解
2019-04-26
【Android】Android中WIFI开发总结(一)
2019-04-26
【Android】Android中WIFI开发总结(二)
2019-04-26
【Android】Android之WiFi开发应用示例
2019-04-26
【Android】 Android adb常见问题整理
2019-04-26
【Android】 Android体系结构图
2019-04-26
【Android】 Android中spinner下拉列表的使用
2019-04-26
说说在 python 中,如何删除左右两边不需要的字符
2019-04-26
说说如何管理 Spring Boot 中的起步依赖
2019-04-26
说说如何在 Linux 中,新建账号
2019-04-26
说说如何在 linux 中搭建 FTP 服务
2019-04-26
说说 Python 的正则表达式
2019-04-26
说说 Spring Boot 属性配置源的加载顺序
2019-04-26
说说如何查看 Python Django 的版本号
2019-04-26
说说 Python Django 应用的基础目录结构
2019-04-26
说说如何在 Python 的正则表达式中使用分组
2019-04-26