篇首语:本文由编程笔记#自由互联小编为大家整理,主要介绍了STM32移植FreeRTOS(图文实操)相关的知识,希望对你有一定的参考价值。
目录
- 一、Freertos
- 1、前后台系统
- 2、可剥夺型内核
- 3、Freertos系统简介
- 二、FreeRTOS移植
- 1.在基础工程种新建Freertos文件夹并且将源码添加到这个文件夹中。
- 2.在poertable文件夹中保留keil 、MemMang 、和 RVDS,其他删除
- 3.在基础工程中新建分组 FreeRTOS_CODE 和 FreeRTOS_PORTTABLE,并且添加.c文件添加头文件.h路径。
- 4.从demo中复制FreeRTOSConfig.h文件
- 5.移植SYSTEM文件里面包括sys.c usart.c delay.c
- 三、FreeRTOS移植验证
首先附上移植包里面包含了文章的完整工程以及FreeRTOS官方资料及源码
点击下载链接
1、前后台系统
早期嵌入式开发没有嵌入式操作系统概念直接操作裸机直接在逻辑上写程序比如51单片机没有操作系统的概念。通常把程序分为前台系统和后台系统。 签单的小系统通常是前后台系统。这样的程序包括一个死循环和若干个中断服务程序应用程序是一个无限循环循环中调用API库函数完成作需的操作大循环叫做后台系统。中断服务程序用于处理系统的异步事件也就是前台系统。前台是中断级后台是任务级。 RTOS全称为Real time OS 就是实时操作系统强调的是实时性。实时操作系统又分为软实时和硬实时。硬实时要求在规定的时间内必须完成操作硬实时不允许超时软实时里面处理过程超时的后果就没有那么严格。在实时操作系统种我们可以把要实现的功能划分为多个任务每个任务负责实现其中的一部分每个任务都是一个很简单的程序通常是一个死循环。
RTOS操作系统 Freertos, UCOS,RTX,RT-THread,DJYOS等 RTOS操作系统的核心内容在于 实时内核。
2、可剥夺型内核
RTOS的内核负责管理所有的任务内核决定了运行哪个任务何时停止当前任务切换到其他任务这个是内核的多任务管理能力。多任务管理给人的感觉就是芯片有多个CPU多任务管理实现了CPU资源的最大化利用多任务管理有助于实现程序的模块化开发能够实现复杂的实时利用。 可剥夺型内核顾名思义就是可以剥夺其他任务的CPU使用权他总是运行就绪任务中优先级最高的任务。
3、Freertos系统简介
Freertos是一个可剪裁可剥夺型的多任务内核而且没有任务数限制。Freertos提供了实时操作系统所需的所有功能包括资源管理、同步、任务通信等。 Freertos是用C和汇编来写的其中绝大部分都是用C语言编写的只有极少数的与处理器密切相关的部分代码才是用汇编写的Freertos结构简洁可读性很强最主要的是非常适合初次接触嵌入式实时操作系统开发者。
为什么要学习Freertos1.因为FreeRTOS开源2.FreeRTOS免费3.FreeRTOS是很多第三方组件钦定的系统
内核源码下载—> www.freertos.org
二、FreeRTOS移植1.在基础工程种新建Freertos文件夹并且将源码添加到这个文件夹中。
将官方文件中FreeRTOS的source复制 粘贴到我们模板工程的FreeRTOS文件夹中
2.在poertable文件夹中保留keil 、MemMang 、和 RVDS,其他删除
在poertable文件夹中保留这三个其他删除 如图
3.在基础工程中新建分组 FreeRTOS_CODE 和 FreeRTOS_PORTTABLE,并且添加.c文件添加头文件.h路径。
建立FreeRTOS_CODE 和 FreeRTOS_PORTTABLE两个分组 FreeRTOS_CODE分组里添加除了stream_buffer.c的剩下六个文件
FreeRTOS_PORTTABLE分组里添加heap4.c的内存管理方式和我们单片机的m3内核 总的添加文件如下图 添加FreeRTOS_CODE里文件的头文件 FreeRTOS_PORTTABLE的头文件
4.从demo中复制FreeRTOSConfig.h文件
粘贴到我们工程的include文件夹里
5.移植SYSTEM文件里面包括sys.c usart.c delay.c
添加它们的头文件 进入stm32f10x_it.c把这些函数屏蔽 再进入到FreeRTOS.h文件把如图宏定义0改成1 添加LED的c文件和头文件以及配置头文件路径
三、FreeRTOS移植验证复制main.c中内容 并且运行测试。可看到LED灯闪烁可以更改引脚配置等实现其他功能
#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "FreeRTOS.h"#include "task.h"//ÈÎÎñÓÅÏȼ¶#define START_TASK_PRIO1//ÈÎÎñ¶ÑÕ»´óС#define START_STK_SIZE 128 //ÈÎÎñ¾ä±úTaskHandle_t StartTask_Handler;//ÈÎÎñº¯Êývoid start_task(void *pvParameters);//ÈÎÎñÓÅÏȼ¶#define LED0_TASK_PRIO2//ÈÎÎñ¶ÑÕ»´óС#define LED0_STK_SIZE 50 //ÈÎÎñ¾ä±úTaskHandle_t LED0Task_Handler;//ÈÎÎñº¯Êývoid led0_task(void *pvParameters);//ÈÎÎñÓÅÏȼ¶#define LED1_TASK_PRIO3//ÈÎÎñ¶ÑÕ»´óС#define LED1_STK_SIZE 50 //ÈÎÎñ¾ä±úTaskHandle_t LED1Task_Handler;//ÈÎÎñº¯Êývoid led1_task(void *pvParameters);int main(void)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é4 delay_init(); //ÑÓʱº¯Êý³õʼ»¯ uart_init(115200);//³õʼ»¯´®¿ÚLED_Init(); //³õʼ»¯LED //´´½¨¿ªÊ¼ÈÎÎñ xTaskCreate((TaskFunction_t )start_task, //ÈÎÎñº¯Êý (const char* )"start_task", //ÈÎÎñÃû³Æ (uint16_t )START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (void* )NULL, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (UBaseType_t )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (TaskHandle_t* ) //ÈÎÎñ¾ä±ú vTaskStartScheduler(); //¿ªÆôÈÎÎñµ÷¶È//¿ªÊ¼ÈÎÎñÈÎÎñº¯Êývoid start_task(void *pvParameters) taskENTER_CRITICAL(); //½øÈëÁÙ½çÇø //´´½¨LED0ÈÎÎñ xTaskCreate((TaskFunction_t )led0_task, (const char* )"led0_task", (uint16_t )LED0_STK_SIZE, (void* )NULL, (UBaseType_t )LED0_TASK_PRIO, (TaskHandle_t* ) //´´½¨LED1ÈÎÎñ xTaskCreate((TaskFunction_t )led1_task, (const char* )"led1_task", (uint16_t )LED1_STK_SIZE, (void* )NULL, (UBaseType_t )LED1_TASK_PRIO, (TaskHandle_t* ) vTaskDelete(StartTask_Handler); //ɾ³ý¿ªÊ¼ÈÎÎñ taskEXIT_CRITICAL(); //Í˳öÁÙ½çÇø//LED0ÈÎÎñº¯Êý void led0_task(void *pvParameters) while(1) LED0~LED0; vTaskDelay(500); //LED1ÈÎÎñº¯Êývoid led1_task(void *pvParameters) while(1) LED10; vTaskDelay(200); LED11; vTaskDelay(800);【文章原创作者:阿里云代理 http://www.558idc.com/aliyun.html 复制请保留原URL】