学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。
注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。
后续文章会同时发表在个人博客(jason1016.club)、CSDN;
视频会发布在bilibili(UID:399951374)
一、为什么FreeRTOS是移植的
相信大家通过序章我本人对单片机与实时操作系统的关系的描述,应该已经大致对二者的联系有了些许概念,但是有概念和实操起来肯定是有很大的出入的。所以在具体讲freertos的移植步骤之前,我先和大家先浅谈一下下FreeRTOS为什么要移植 以及为什么要叫做移植。(当初学FreeRTOS的时候网上那些教程第一步就是教你移植,但是却没有说清楚移植是为了什么,搞得跟强吻一样hhhh,所以我这里先给大家铺垫一下,当然,不涉及FreeRTOS内核原理的,前面这几章都是偏向入门的大家可以放心食用)
首先就是为什么要移植的问题:之前说过操作系统就是一个人的做人方式和行为准者嘛,那对于个人而言要培养一个好的行为准者就得上学去不断学习这里为人处世的道理嘛,对于单片机而言也一样要拥有一个全新的行为方式最简单最快捷的方案同样也是去"学习"嘛。
其次就是什么是移植的问题了:书接上文,而当我们想要我们自己的单片机拥有FreeRTOS的行为方式最好的方式就是"把FreeRTOS的教学资料给他,他自己就学会了嘛",那我们具体要做的就是去网上下载FreeRTOS的"资料"直接塞给他(当然还是要按规范部署的),他就可以直接学会FreeRTOS了,是不是很简单?但是这个就是单片机的移植。那如果我们不想移植FreeRTOS想移植linux呢,一样的道理也是去下载linux的移植资源再去部署,当然linux的移植要复杂的多。
当然看到这里肯定有同学要问了,操作系统只能移植吗?当然不是,就像我们学习一下,难道我们要练就一套好的做人方式和行为准则只能去上学或者看书学习别人的资料吗?我们也可以通过自身的自勉,父母的教导,家庭的氛围养成一套自身的行为准则。同样的这也就是说单片机的操作系统也并非都需要移植,单片机的操作系统也可以由"他的父母"也就是我们一级开发者给他编写好一个操作系统嘛。当然自己写一个好的这是非常难的一件事,所以我们大多采用移植的方式快速降低成本和难度。
这类操作为什么要称为移植而不是安装呢?本来我是认为这两个之前是没什么差距的,但是通过直接去看二者之间的定义区别就能看出差距,安装是赋予单片机新的可执行的任务,而移植是赋予单片机新的处理任务的方式。简单来说,安装的话就是我们手机下载一个APP,只是创造了一个新的任务,但是移植的话就相当于给手机移植了一个Android系统嘛。一个外在一个内在,还有有很大的出入的。
二、FreeRTOS的移植
下载
下载FreeRTOS例程包(注意下载时下载v9.0版本就好了,这个并不是版本越高越好的,v9.0以上拓展了插件会影响初学者体验)
下载链接:https://zenlayer.dl.sourceforge.net/project/freertos/FreeRTOS/V9.0.0/FreeRTOSv9.0.0.zip
资源链接:FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS/V9.0.0 at SourceForge.net
1、标准库移植方案
相信大家手头都有自己的单片机裸机例程了吧,毕竟个人感觉每个人的代码和文件习惯不一样,也导致每个人的单片机文件格式千差万别,当然适合自己的就是最好的因此我就不给大家提供裸机例程模板了,以免大家要反过来兼容我的代码习惯搞得大家都不好。
移植准备
1、准备上述下载的FreeRTOS例程包
2、准备供FreeRTOS移植的stm32裸机模板
移植过程
第一重移植:
在裸机模板的根目录创建一个FreeRTOS文件夹
把FreeRTOS例程包根目录\Source目录下的文件全部复制放到刚刚裸机模板创建的FreeRTOS文件夹内
移植的文件:
移植后的文件:
删除部分文件:
删除除Keil、MemMang、RVDS以外的所有文件以及文件夹
删除后的文件结果
第二重移植:
找到FreeRTOS例程包:FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil 文件夹复制 FreeRTOSConfig.h 文件
将此文件移动到裸机模板:stm32裸机模板(Jason)\FreeRTOS\include 文件夹中
移植的文件:
移植后的文件:
移植后Keil的配置
将上述的include包和portable\RVDS\ARM_CM3导入到初始构建目录
如下图将对应文件放入keil并分类
测试
输入下面测试代码到主函数,build,若成功则移植完成
cpp
#include "stm32f10x.h" // Device header
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define LED0_TASK_PRIO 2
#define LED0_STK_SIZE 50
TaskHandle_t LED0Task_Handler;
void led0_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )led0_task,
(const char* )"led0_task",
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0Task_Handler,
(TaskHandle_t* )&LED0Task_Handler);
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
void led0_task(void *pvParameters)
{
while(1)
{
}
}
本文为作者独立编写,本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。