IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-09-23 -> 正文阅读

[嵌入式]2021-09-23

实时操作系统

RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。 RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。 RTOS操作系统的核心内容在于:实时内核

嵌入式操作系统:

  1. 大部分有源代码(C语言编程);
  2. 可移植性强;
  3. 有很高的硬件依赖性(汇编语言编程,压缩代码执行时间);
  4. 可裁剪性(根据项目需求裁剪操作系统,缩短内核占用空间);
  5. 可剥夺型操作系统内核;
  6. 多任务管理;
  7. 调度任务执行时间可确定性;

嵌入式操作系统的作用:
操作系统是个软件(管理底层硬件,并且上层应用提供接口)
在这里插入图片描述

FreeRTOS

  • Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。

  • 操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。

  • FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。

  • 选择FreeRTOS:
    (1)FreeRTOS是免费的,学习RTOS操作系统的话 uC/OS是首选,但要做产品的话,免费的FreeRTOS操作系统就是个不错的选择。
    (2)许多半导体厂商产品的 SDK(Software Development Kit—软件开发工具包) 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。
    (3)简单,因为FreeRTOS 的文件数量很少。

  • FreeRTOS操作系统特点:
    FreeRTOS 的内核支持抢占式,合作式和时间片调度。
    提供了一个用于低功耗的 Tickless 模式。
    系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、软件定时器等等。
    FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F429。
    FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
    高可移植性,代码主要 C 语言编写。
    高效的软件定时器。
    强大的跟踪执行功能。
    堆栈溢出检测功能。
    任务数量不限。
    任务优先级不限。

FreeRTOS在STM32F103移植

前期准备

FreeRTOS源码: 官网源码,尽量下载长期支持版本

创建好的空工程,方便排查是移植问题还是工程问题;

源码目录分析

源码解压目录
FreeRTOS–>Source打开:
在这里插入图片描述
FreeRTOS–>Source–>portable打开:
在这里插入图片描述
FreeRTOS–>Demo打开:
在这里插入图片描述

移植

  1. 将整个Source文件夹移植到项目文件夹下,更名为“FreeRTOS”;

  2. 其他文件夹不动,将portable文件夹下的RVDS和MemMang文件夹选择内容拷贝到portable文件夹下,如下:
    在这里插入图片描述

  3. 拷贝Demo文件夹下,关于STM32F103在keil编译器下的FreeRTOSConfig.h到user文件夹;

  4. 添加C文件到工程下:目录如下:
    在这里插入图片描述

  5. 添加头文件路径:
    在这里插入图片描述

  6. 修改FreeRTOSConfig.h

添加



#define configUSE_TIME_SLICING 1 //使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //硬件计算前导零指令,如果所使用的, MCU 没有这些硬件指令的话此宏应该设置为 0
#define configUSE_TICKLESS_IDLE 0 //置 1:使能低功耗 tickless 模式;置 0:保持系统节拍(tick)中断一直运行
#define configUSE_QUEUE_SETS 1 //启用队列
#define configUSE_TASK_NOTIFICATIONS 1 //开启任务通知功能,默认开启
#define configUSE_MUTEXES 1 //使用互斥信号量
#define configUSE_RECURSIVE_MUTEXES 1 //使用递归互斥信号量
#define configUSE_COUNTING_SEMAPHORES 1 //为 1 时使用计数信号量
#define configQUEUE_REGISTRY_SIZE 10 //设置可以注册的信号量和消息队列个数
#define configUSE_APPLICATION_TASK_TAG 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
#define configUSE_MALLOC_FAILED_HOOK 0 //使用内存申请失败钩子函数
#define configCHECK_FOR_STACK_OVERFLOW 1// 大于 0 时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数如果使用的话此值可以为 1 或者 2,因为有两种栈溢出检测方法
#define configGENERATE_RUN_TIME_STATS 0 //启用运行时间统计功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configUSE_TIMERS 1 //启用软件定时器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
#define configTIMER_QUEUE_LENGTH 10 //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
//可选函数配置选项
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
//中断服务函数 也可以修改起始文件
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

  1. 修改STM32f10x_it.c
/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
//void SVC_Handler(void)
//{}

/**
  * @brief  This function handles PendSV_Handler exception.
  * @param  None
  * @retval None
  */
//void PendSV_Handler(void)
//{}

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
//void SysTick_Handler(void)
//{}

void vApplicationStackOverflowHook(void)
{
	while(1)
	{}
}

  1. 编写多任务功能main.c

此处以一个任务举例

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "freertos.h"
#include "task.h"

TaskHandle_t ledHandle=NULL;


void LEDTesk(void *p)
{
	while(1)
	{
		//功能
		LED_Off(GPIOE,2);
		LED_Off(GPIOE,3);
		LED_Off(GPIOE,4);
		LED_Off(GPIOE,5);
		vTaskDelay(500);
		
		LED_On(GPIOE,2);
		LED_On(GPIOE,3);
		LED_On(GPIOE,4);
		LED_On(GPIOE,5);
		vTaskDelay(500);
	}
}

int main(void)
{
	Led_Config();
	
	xTaskCreate(LEDTesk,"led",56,NULL,2,&ledHandle);
	
	vTaskStartScheduler();
  while (1)//启动成功,将不会执行该出
  {
	
  }
}

  1. 编译,下载,灯闪烁

FreeRTOS任务运行管理

官网API链接:FreeRTOS操作任务管理API函数

结束语

实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。
l 商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。
l 免费型的实时操作系统在价格方面具有优势,目前主要有Linux,μC/OS是一种源码开放的商业RTOS。

学习实时操作系统:
嵌入式系统以应用为中心,应用时选择“适用”的操作系统;
自己“写”RTOS——一种学习态度;

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:44:32  更:2021-09-24 10:45:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:07:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码