嵌入式/FreeRTOS
文章平均质量分 92
FreeRTOS源码解析,配合STM32编程实践
码农爱学习
码农爱学习,专注嵌入式~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦原创 2021-04-26 00:00:00 · 18753 阅读 · 13 评论 -
FreeRTOS设计模式借鉴——设计一个滑动平均滤波器
之前的几篇文章对FreeRTOS的部分源码进行了分析,可以发现FreeRTOS对于任务、事件标志组、消息队列等的实现都是通过控制块的方式来操作。比如任务有任务控制块TCB_t,事件标志组有事件控制块EventGroup_t,消息队列有消息队列控制块Queue_t,软件定时器有软件定时器控制块Timer_t。使用它们前都是先创建(内存分配资源),返回一个控制块的句柄,之后就可以通过句柄来操作这个对象了。基本原理以FreeRTOS的这种机制为参考,我们可以模仿着实现一个简单的滤波器,可以用于对传感原创 2021-01-17 21:55:51 · 753 阅读 · 1 评论 -
FreeRTOS源码探析之——消息队列
1 消息队列基础1.1 消息队列的运作机制创建消息队列时FreeRTOS会先给消息队列分配一块内存空间,这块内存的大小等于消息队列控制块大小加上(单个消息空间大小与消息队列长度的乘积),接着再初始化消息队列,此时消息队列为空。任务或者中断服务程序都可以给消息队列发送消息,当发送消息时:如果队列未满或者允许覆盖入队,FreeRTOS会将消息拷贝到消息队列队尾否则(队列已满),会根据用户指定的阻塞超时时间进行阻塞,在这段时间中,如果队列一直不允许入队,该任务将保持阻塞状态以等待队列允许入队。当其原创 2021-01-03 12:55:26 · 999 阅读 · 0 评论 -
FreeRTOS源码探析之——任务调度相关
FreeRTOS可以运行多任务,在于其内核的任务调度功能,本篇介绍任务调度的基本思路与部分源码分析。1 裸机编程与RTOS 的区别1.1 裸机程序基本框架/*主函数*/int main(){ init();//一些初始化 /*死循环*/ while(1) { do_something_1();//执行一些逻辑 do_something_2(); }//循环执行}/*中断服务函数*/IRQ_Handler(){原创 2020-12-13 23:19:35 · 1331 阅读 · 0 评论 -
FreeRTOS源码探析之——事件标志组
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。1 基础概述1.1 基本作用事件标志的作用类似于全局型的flag,多个标志组合在一起构成事件标志组,这里先分析一下事件标志组于全局flag的区别:使用事件标志组可以让 FreeRTOS内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心使用事件标志组可以有效地解决中断服务程序和任原创 2020-11-30 00:19:56 · 1342 阅读 · 0 评论 -
FreeRTOS源码探析之——软件定时器
软件定时器是FreeRTOS中的一个重要模块,使用软件定时器可以方便的实现一些与超时或周期性相关的功能,本篇从FreeRTOS的源码入手,来分析FreeRTOS软件定时器的运行机理。1 基础知识1.1 软件定时器与硬件定时器的区别硬件定时器每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息硬件定时器的精度一般很高,可以达到纳秒级别硬件定时器是芯片本身提供的定时功能软件定时器指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息硬件定时器的定时精度原创 2020-11-22 14:22:36 · 2308 阅读 · 0 评论 -
嵌入式中的合作开发——函数指针
在嵌入式软件开发中,一个项目往往需要多人协作完成。比如A需要完成项目的整体逻辑功能,而整个逻辑功能包含许多具体的小功能,但A又没有时间或能力来实现这些小功能,这时可以让B来协助实现函数内部的功能。通常的思路是,B写好某个函数后,A直接通过B声明的函数调用即可。但这会有一些问题,例如B写好函数之后,A只能使用B声明的函数名来使用,假如B声明的函数名的命名规则很不符合A的口味,A用起来就很不爽,哈哈。那这样怎么办呢?聪明的A可以自己再声明一个自己喜欢的函数名,并通过函数指针传递的功能来获得B的功能。下面原创 2020-10-25 17:10:29 · 838 阅读 · 1 评论 -
嵌入式开发,各类存储方式知多少?
ROM & RAMROM(Read Only Memory)ROM在系统停止供电的时候仍然可以保持数据,如光盘CD-ROM,可以保存文件,且只能读取。RAM(Random Access Memory)RAM通常都是在掉电之后就丢失数据,如计算机的内存条就是RAM,关机后内存数据被自动清空。PROM & EPROM && EEROMROM又可分为几类PROM可编程的ROM,但只能写入一次(有点像光盘,只能刻录一次),这种是早期的产品,现在已经不原创 2020-09-06 14:53:22 · 955 阅读 · 0 评论 -
MPU6050姿态解算2-欧拉角&旋转矩阵
IMU姿态解算IMU,即惯性测量单元,一般包含三轴陀螺仪与三轴加速度计。之前的文章MPU6050姿态解算1-DMP方式已将对MPU6050这款IMU作了简单的介绍,并通过其内部的DMP处理单元直接得到姿态解算的四元数结果。本篇将通过软件解算的方式,利用欧拉角与旋转矩阵来对陀螺仪与加速度计的原始数据进行姿态求解,并将两种姿态进行互补融合,最终得到IMU的实时姿态。本篇的姿态解算选用的旋转顺序为ZYX,即IMU坐标系初始时刻与大地坐标系重合,然后依次绕自己的Z、Y、X轴进行旋转,这里先自定义一下每次的旋转名原创 2020-08-23 19:10:40 · 26566 阅读 · 15 评论 -
欧拉角旋转
欧拉角是一种表示三维旋转的描述方法,欧拉角的计算需要借助旋转矩阵,关于旋转矩阵的知识可先参考之前的文章:3维旋转矩阵推导与助记欧拉角旋转静态定义对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的,可以先简单的理解理解为大地坐标系,也称惯性坐标系。坐标系则固定于刚体,随著刚体的旋转而旋转,比如飞行器自身的坐标系,也称载体坐标系。如上图为一种ZYZ顺序旋转的欧拉角示意图:设蓝色的xyz-轴为惯性系的参考轴,即大地坐标系的3个轴。原创 2020-08-23 18:54:31 · 6023 阅读 · 8 评论 -
3维旋转矩阵推导与助记
旋转矩阵的应用范围比较广,是姿态变换,坐标变换等的基础。本篇先介绍旋转矩阵的推导过程与助记方法。平面二维旋转如下图,XY坐标系中,向量OP旋转β角度到了OP’的位置:根据三角函数关系,可以列出向量OP与OP’的坐标表示形式:对比上面个两个式子,将第2个式子展开:用矩阵形式重新表示为:这就是二维旋转的基本形式,中间的矩阵即二维旋转的旋转矩阵,坐标中的某一向量左乘该矩阵后,即得到这个向量旋转β角后的坐标。三维旋转三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用原创 2020-08-17 22:48:24 · 6966 阅读 · 6 评论 -
MPU6050姿态解算1-DMP方式
MPU6050的姿态解算方法有多种,包括硬件方式的DMP解算,软件方式的欧拉角与旋转矩阵解算,软件方式的轴角法与四元数解算。本篇先介绍最易操作的DMP方式。MPU6050基本功能3轴陀螺仪陀螺仪,测量的是绕xyz轴转动的角速度,对角速度积分可以得到角度。3轴加速度计加速度计,测量的是xyz方向受到的加速度。在静止时,测量到的是重力加速度,因此当物体倾斜时,根据重力的分力可以粗略的计算角度。在运动时,除了重力加速度,还叠加了由于运动产生的加速度。DMP简介DMP就是MPU6050内原创 2020-07-29 23:18:52 · 20873 阅读 · 6 评论 -
从IIC实测波形入手,搞懂IIC通信
玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。1 IIC基础知识首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后我们通过分析IIC的真实波形,这些疑问可能就豁然开朗了~1.1 IIC是什么IIC(Inter Integrated Circuit,集成电路总线)是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制原创 2020-07-19 20:35:42 · 18693 阅读 · 14 评论 -
FreeRTOS例程4-串口DMA收发不定长数据
基础知识点DMADMA(Direct Memory Access),即直接内存存储,在一些数据的传输中,如串口、SPI等,采用DMA方式,传输过程不需要CPU参与,可用让CPU有更多的时间处理其他的事情。STM32F4的DMA通道选择如下:接下来的程序思路如下:编程要点DMA发送串口DMA发送配置由于是发送不定长的数据,先不需要配置发送的长度,在每次的发送时,再配置。//=======================================//串口DMA发送配置//====原创 2020-07-14 00:06:28 · 5898 阅读 · 0 评论 -
FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用
基础知识点串口中断种类串口中断属于STM32本身的资源,不涉及到FreeRTOS,但可与FreeRTOS配合使用。串口接收中断中断标志为:USART_IT_RXNE,即rx none empty,串口只要接收到数据就触发中断,如果是接收一个字符串,则每接收到一个字符就触发一次中断。串口空闲中断中断标志为:USART_IT_IDLE,idle即空闲的意思,串口空闲时触发的中断,当然也不是说串口空闲时就一直触发中断,而实在每个连续的接收完成后,触发中断,如果是接收一个字符串,则接收完整个字符串后,触原创 2020-07-05 22:24:20 · 8781 阅读 · 0 评论 -
FreeRTOS例程2-任务挂起恢复与使用中断遇到的坑!
任务挂起简单点理解就是现在不需要执行这个任务,然它先暂停,就是挂起。恢复就是从刚才挂起的状态下继续运行。另外,结合中断使用需要注意避免入坑,文章后半段有介绍。API函数任务挂起vTaskSuspend()函数原型(tasks.c中):void vTaskSuspend( TaskHandle_t xTaskToSuspend )参数:xTaskToSuspend:需要挂起的任务句柄任务恢复vTaskResume()函数原型(tasks.c中):void vTaskResume( T原创 2020-06-06 19:44:20 · 7656 阅读 · 4 评论 -
FreeRTOS例程1-基础任务创建
API函数任务创建 xTaskCreate()函数原型(tasks.c中):BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters,原创 2020-06-03 22:59:41 · 1825 阅读 · 0 评论 -
FreeRTOS移植-基于STM32F407
首先新建或找一个基于Keil的STM32基础工程,这里我已经创建好了一个STM32F407VET6的工程模板,工程结构如下图的第1步的矩形框内所示。下面需要移植FreeRTOS了,将FreeRTOS的源码文件复制到工程文件夹中,一些用不到的文件可删除(哪些文件需要用到可参考上一篇的源码结构分析部分),然后在Keil中也创建一个FreeRTOS目录,将c文件添加进工程,注意port.c来自于RDVS的ARM_CM4F,对应于移植到的SMT32F407硬件。添加完c文件后,还要添加对应的h文件的搜寻路径,原创 2020-05-31 12:59:00 · 2877 阅读 · 3 评论 -
FreeRTOS介绍与源码结构分析
FreeRTOS简介FreeRTOS,全称Free Real Time Operating System,即免费的实时操作系统。相比于计算机中用到的Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级的操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式在处理多个任务时的实时性不高的问题。目前的实时操作系统有好多种,除FreeRTOS外,还有μCOS、RT-Thread、RTX、Alios Things、Huawei LiteOS等。什么是RTOS?实时操作系原创 2020-05-31 10:02:58 · 3049 阅读 · 0 评论
分享