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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C语言—日期处理—实例练习巩固基础(4)
下一篇:C语言—轮询验证—实例练习巩固基础(3)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月06日 04时48分53秒