FreeRTOS-STM32操作系统

热度:1 发布时间:2024-04-23 09:03:40来源:必发bf88官网网

  在单片机的Helloworld程序中(让LED实现闪烁)的过程中,常常用到了延时,在这个延时过程中CPU相当于什么样的事情都没干,当然这只是个实现电平翻转的简单任务。但是一旦任务增多后CPU的算力就大打折扣,因为在延迟的过程中,CPU这个“劳动者”在等待时间消息,几乎不再工作,这就需要一种方法去最大化“压榨”CPU的算力,使得CPU全时间满负荷运行。

  裸机系统、轮询系统、前后台系统、多任务系统。轮询系统就是一个主程序中不断运行无限循环里边的程序内容;前后台系统就是在轮询系统中加入了中断,中断事件的处理是在中断函数做处理的,中断是前台,主程序是后台;多任务系统是事件的中断处理在主函数,中断函数负责传递中断标志位。

  常见的操作系统如下:常用的RTOS有国外的FreeRTOS、μC/OS、RTX 和国内的 FreeRTOS、HuaweiLiteOS和AliOS-Things 等,其中尤以国外开源且免费的FreeRTOS 的市场占有率最高。操作系统实际上的意思就是把硬件资源虚拟化,把单核处理虚拟成“多核”提高“并发”感。这种思想很重要,类似的有虚拟机,还有当下大量应用于物联网的Docker技术。

  对于单核ARM单片机来说,要达到两个进程任务的几乎同步态,那是不可能的,所以对于多任务系统,要限制每个任务的运行时间,所以就需要分时切片处理,如下图,运行两个任务进程,每个任务进程的运行时间所占据的时间片一样的,只要时间片划分足够小,例如在毫秒级别上进行任务切换能够完全满足大部分系统的稳定运行需求。时间片上运行过程如下图 运行结果如下下图:

  在操作系统,每一个要执行的任务,也就是一段程序的运行过程被称为一个进程。进程包含着动态的概念,它是一个程序的运行过程,而不是一个静态的程序。进程体现在程序中形式实际上就是一段循环执行的代码,使用操作系统的任务创建函数创建了这个进程之后,操作系统就自动找到这段代码并执行。一段程序执行时,一般划分成三个阶段,开始执行--->

  执行中--->

  执行完成。这也恰好对应了进程的工作状态:就绪态(Ready)--->

  运行态(Running--->

  终止态(Blocked)。如果在一个进程执行的过程中,调用了将进程挂起的功能函数,或者是进程执行时有更高优先级的 任务就绪了,则进程会进入挂起状态(Suspended)。容易把阻塞态与挂起态相混,我的理解是处于阻塞态的时候进程在等待一个信号条件满足后继续运行,该信号条件可以是中断可以是信号量等等。而处于挂起态的时候该程序根本没运行,就像一个人被挂起,那他根本不可能完成任何任务。

  由于使用时间切片引起任务进程的暂停轻易造成正在处理的数据丢失,所以操作系统需要给每个任务进程分配一个内存,存储上个时间片尚未处理的任务数据。

  同时任务进程的工作并不是完全独立的而是互相交替访问的,各个进程的通信也需要轻易造成对某个变量的的访问极易出现冲突,所以要一个信息传输的介质-存储队列。该消息队列既能写入数据也能读取数据,消息队列对象一般以全局变量进行声明。消息缓存空间使用先进先出FIFO方式来进行存储,实现效果如下图。

  有限的硬件资源可能会被多个进程同时访问,并且有的进程对被控制实体的作用是相反的,极短时间内互斥任务进程的切换极易使得被控对象产生震荡,所以要对互斥进程做一个规约,这个规约的实现就是信号量,FreeRTOS中能轻松实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。也可以用作进程顺序执行或者同步运行的保证。

  具体来说信号量是一个非负整数,由临界资源释放,当信号量为0时,剩余任务进程失去资源访问的机会,只有当另一个任务停止访问临界资源时,才会释放出信号量。采用信号量的实现过程如下图所示。

  单片机开发中用的最多就是二值信号量了,能够理解为一个位0和1,也能够理解为true或false如下图为二值信号量的实现过程。访问的任务进程只能有一个,所以就能避免访问资源引起的竞争与及规避控制效果的互斥。

  在一个复杂控制管理系统中一个控制量常常需要多种事件的出现才能触发,事件的发生与消失用1和0来表示。多事件的状态能够最终靠FreeRTOS中的事件库进行事件状态的统一管理,FreeRTOS中一个事件组为32位,可通过配置文件修改其长度。

  要看懂FreeRTOS源码了解其原理,那么必须要学会c语言中常用的数据结构---链表结构,链表的源文件在list.c文件中,大体上分为单向链表和双向链表,单向链表有头尾之分,双向链表则构成了一个环,分别指针分别指向上个链表节点地址和下个链表节点地址。

  可以看出链表本身就不包含大量数据的存储,链表是一个动态的数据结构,将不连续的离散的硬件地址通过链表映射形成虚拟的连续存储地址,面试中也常常问到链表和数组的区别,数组是开辟了一个连续的存储地址,位置固定。

  用最基础的部分的理解就到此结束,当然考虑到不同任务进程的优先级以及不同任务执行的时间长短,和kernel等事件的触发中断,因此FreeRTOS有着更复杂的调度机制,比如本文开头提到的时间片轮转法,在考虑到任务优先级的时候,该算法根本不能够确保高优先级的进程任务的执行,而且不同任务在排队列表中顺序各有差异。排队靠前的低优先级任务和排队较后的高优先级任务怎么取舍等一系列的问题。当然能明确的是本系统的调度是由“先来先服务(FCFS)”调度算法,“优先级”调度算法,“时间片轮转”调度算法三种算法共同作用的。而且还能够最终靠设置宏configUSE_PREEMPTION来定义是采用抢占式还是合作式操作系统(说太多了不解释了.....)。

  其实把用起来就知道操作系统的一个重要工作就是执行各个进程的状态切换,因为实际上单片机每次只能运行一个进程,而操作系统通过适当的管理,让每一个进程都能够获得及时的响应,让多个进程呈现出一种同时运行的“并发”感,和一根信号上传输多种信号的思想是一致的都是分时处理,但是速度肯定不及两根信号线分别传输两种信号。

  现在的嵌入式入门门槛已经很低,原有的STM32固件库官方不在更新,使用CubeMX生成的HAL库正在逐渐替代原有的固件库,大幅度的降低开发门槛提高开发效率。当然熟悉板子上的常用的寄存器会让你得心应手。

  (1)FreeRTOS一定要配置好系统时钟,给予一个单独的硬件时钟源作为系统时钟。否则时间片的长度为无限大..程序只运行第一次进入的进程任务。

  (5)应用操作系统是让CPU算力最大化,所以尽量使用官方提供的外设,GPIO口的通信最好还是不要选择模拟协议自行编程,因为中间需要加入非操作系统的微秒级延迟,降低了CPU的使用效率。

  (7)单片机硬件系统会产生各式各样的中断,而FreeRTOS能够在一定程度上帮助你去对管理中断,由于STM32的内核中断优先级过高,所以规定FreeRTOS能使用的中断级别大于4.

  利用彩屏显示图片需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。 彩屏的驱动程序如果写好的话,就可以一直使用了,精力大多分布在在应用程序的编写就可以了,但是移植的话,要移植驱动程序。其实移植也只是改变那些很底层的靠近处理器的那部分代码。 因为STM32F103C8的片上只有64K的FLASH,所以不能存储太多的图片数据,也就不能显示太大的图片。 一下的程序注释的比较详细,看懂了基本上就可以用了。 彩屏驱动程序的头文件lcd.h如下: #define uchar unsigned char #define uint unsigned int #define Bus_16 //

  今天教大家编写 STM32 的bootloader,其实编写bootloader主要事项有以下: 1、为你的bootloader程序选择存储器地址,因为 STM32 的存储器FLASH存储程序代码空间为512K,有必要进行划分。 2、若需要使用JTAG在线调试,则需要配置区域: 3、为您的用户程序选择正真适合的存储空间: 同时配置在线、bootloader程序编写基本流程如下: 1)检测有无需要更新的标志,用户可自定义。比如说读取flash某位置存储的字节作为标志位。 2)如需更新,则调用 STM32 的FLASH程序擦鞋用户代码部分。 3)将新的bin文件(即2进

  bootloader /

  简介:STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换。 有2种划分转换组的方式:规则通道组和注入通道组。通常规则通道组中能安排最多16个通道,而注入通道组能安排最多4个通道。 在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。 一个不太恰当的比喻是:规则通道组的转换好比是程序的正常执行,而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。 再举一个不一定使用的例子: 假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室

  ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以能进行同步采样。 2ADC的输入时钟不允许超出14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。 3.ADC转换时间: STM32F103xx增强型产,时钟为56MHz时为1μ s( 时钟为72MHz为1.17 μ s) 4.ADC的转换精度默认设置为12位,输入范围: ADC输入范围:V REF-≤ VIN ≤ VREF+ 5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在ADC1_IN16,内部参考电压V REFINT连接在ADC1_IN17 6.转

  (1)问题描述: 多串口共用printf函数,百度到的资料大部分是建议重新写一个xx_printf(format, …)。但是用起来还是不方便,就此问题而言加上一个判断语句便可解决。 (2)解决办法: printf函数最后调用的是int fputc(int ch, FILE *f),那么重新改写此函数便可。 (3)代码: //标志量定义 int USART_PRINTF_FLAG = 2;//默认串口2 //改写fputc int fputc(int ch, FILE *f) { if (USART_PRINTF_FLAG == 2) { while(USART_GetFlagStatus(U

  lcd屏显示字符串和数字操作的两个通用函数 /

  无线飞鼠(一) 时间过得好快,大三已经过了一半了,最近一段时间忙的没有更新过博客,回顾下自己最近一段时间中的收获,感觉蛮多的。下边就一一分享下。 一个月前,接到一个朋友的求助,帮忙做一份毕设,其实本来自己也没时间做的,一直在忙这做学校的创新项目,面对朋友的求助,我只好答应了,谁叫我这么爱帮助别人呢!说也很奇怪,自己常常帮助别人回答一些力所能及的问题,每天都有人加我,问一些基础的问题,我也干到很欣慰,帮助别人的过程中自己收获的也挺大的。 盆友的毕设叫做“无线飞鼠”。也就是个鼠标而已,和普通的鼠标相比优点是能够在空中来控制,这样的一个东西出来好多年了,非常流行的,自己也想试一试,就开始着手做了。 一、选材(硬件选择) 首先

  RTC代表的是实时时钟的意思,因为它提供的时钟基准比较准确所以用处还是很多的。 RTC全局中断: void RTC_IRQHandler() { if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) //是否闹钟中断发生 { printf( THE ALARM READY =%d rn ,RTC_GetCounter());//输出此时的秒数 RTC_ClearITPendingBit(RTC_IT_ALR); PWR_BackupAccessCmd(ENABLE); RTC_EnterConfigMode(); RTC_WaitForLastTask(); RTC_SetAlarm(40+RTC_Ge

  启动文件浅析

  PID控制C语言实现位置 增量型抗积分饱和积分分离 变积分


  【电路】将DHT11温度和湿度传感器与STM32F103C8连接的方法

  嵌入式工程师AI挑战营(初阶):基于RV1106,动手部署手写数字识别落地

  有奖直播 瑞萨新一代视觉 AI MPU 处理器 RZ/V2H:高算力、低功耗、实时控制

  【下载】LAT1396 STM32CubeIDE实用技巧之STM32H7双核调试的配置

  【下载】LAT1343 STM32H5 USBD Classic驱动 CDC移植

  【下载】LAT1392 LTDC RGB接口 LCD的TouchGFX工程的移植步骤

  【直播】4月11日,STM32Trust如何帮助新产品设计提升信息安全保护能力

  【线日,基于Buildroot制作STM32MP13启动镜像-深圳/厦门/西安/郑州/苏州

  【新品】STM32U0新一代超低功耗入门级MCU,助力终端产品省电,安全,BOM成本低

  【新品】 STM32H7R/S基于Cortex-M7,运行频率高达600 MHz,板载闪存型MCU 拥有高速的外部存储

  【新品】STM32WBA54/55 支持BLE5.4、IEEE 802.15.4通信协议、Zigbee®、Thread和Matter协议

  【新品】STM32MP2 最高配备双核Arm® Cortex®-A35和Cortex®-M33的STM32MP2系列微处理器

  【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性

  这几日,MLCommons公布MLperf Tiny v1 2测试结果。这一次,哪些MCU芯片夺得榜一?...

  STM32与Actility ThingPark的合作实现高效的无线固件更新

  在物联网(IoT)领域,无线固件更新(FUOTA)技术的引入明显提高了设备管理的效率和灵活性。STM32与Actility ThingPark平台的结合,为开发 ...

  在“嵌入式学习006_Systick使用(一)”中,详细的介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3 5版本的标准固件库中,移 ...

  用到GPIO口 PA0~PA11共12个引脚因为是共阳所以12,9,8,6为电源输入,其他引脚均为接地,所以对于芯片来说12,9,8,6高位输出,其他设定 ...

  这是我在做单片机最小系统板时候碰到的问题,之前虽然也做过相似的板子,可是未曾出现过无源晶振不起振的问题。下面是我在遇上问题后的一些 ...

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程