FreeRTOS系列(一) STM32 FreeRTOS移植,不就是打个勾吗?

2024-01-24 23:18

本文主要是介绍FreeRTOS系列(一) STM32 FreeRTOS移植,不就是打个勾吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此系列以F103VET6芯片为例

使用CubeMx 移植FreeRTOS,简直傻瓜式!!!!不懂Cube使用的先去学习学习吧!

一、新建工程

只需要把这里勾上就OK了,其它都是常规配置,记得把时钟配置上,我这里添加了一个串口,用于测试演示,LED都懒得配置了,哈哈!!


FreeRTOS的配置在这里,先不用管它,直接跳过,以后用到再说


直接点击生成,发现有警告:


是说FreeRTOS和HAL库的时钟源由冲突,然后强烈建议我们把时钟源改为其它的,既然这么强烈建议,那我们就改呗!


我这里随便改成了定时器8,大家随意改就可以了,没什么关系的!

改好之后就可以生成代码了

二、测试程序

1、先不管程序怎么写,先看看官方的代码是怎么整的


130行的注释告诉我们,131、132定义并且生成了一个默认任务(StartDefaultTask);

135的注释又告诉我们在此处添加队列

139,添加队列

144,看函数名称是说启动内核

146,我们永远不会到达这里,因为有调度器(scheduler)的控制

一大堆乱七八糟的新名词,先不管,看看怎么写测试代码在说。

2、分析

FreeRTOS是多任务系统,我们要写代码,其实就是要增加任务,那怎么增加任务呢?

刚好例程给了我们一个默认任务,看看它是怎么添加的,直接全局搜索一下这个默认任务(StartDefaultTask)

发现源代码就在这里:


什么都没有,就只有一个延时函数,那就依样画葫芦呗,直接复制粘贴(记得printf的重定向弄好):


任务定义好了,那就添加任务呗!还记得不?135的注释告诉我们在此处添加队列

编译一下就报错了!


说是os_thread_def_defaultTask重定义了,不过好像我们也没用到这个东西吖!全局搜索一下它!(全局搜索是个好东西吖!)

结果ri了gou了,一查没有吖!找不到这个鬼东西,再查一下defaultTask,也TM找不到,没定义就使用的变量,没理由啊,难道我的C语言学错了???

好了答案揭晓,C语言肯定没有不定义就可以使用的变量,这里的 defaultTask,根本就不是一个变量。

要弄清楚为什么这里可以使用defaultTask,那就要看看osThreadDef到底是个什么东西了:


osThreadDef不是个函数,而是个宏定义,它就是定义了一个名字叫 os_thread_def_##name 的osThreadDef_t类型的变量,并且把这个变量赋值了。

这里看起来这么复杂,我写简单点就可以看懂了:


osThreadDef的宏定义跟我写这个测试的宏定义其实差不多。

那os_thread_def_##name又是怎么回事?那就要知道“##”和“#”的用法了,两个都是预编译的命令:

1、##是把宏参数合并到前面的一个字符

2、#是把宏参数直接转换为字符串

可以测试一下:


可以看到,我从来就没有定义过一个变量叫ABCDEFGH,或者a0的变量,但我的程序却可以完美的运行!

认真看看##和#的作用,这就是预编译+宏定义的魅力了(是不是有学到了,哈哈)

清楚了##和#的作用后,我们就知道了,编译后错误警报说是os_thread_def_defaultTask重定义了,就是因为这个东西作祟,所以,我们改一下:


编译,通过了!有两个警报:


这两个变量,就是osThreadDef这个宏定义里面帮我们定义了的变量。

既然运行通过,那就烧录代码看看呗!

结果懵了,为何没东西输出呢?查了一下,printf是正常的,那么是怎么回事呢?

想想那两个警告,没道理说这两个变量没使用吖,根据复制后的对应原则,检测一下代码,发现问题了


原来是后面的忘记改了,这下编译一下,居然两个警告没了,看看这个osThread是何方神圣?


原来也是个宏定义,而且也用了##,还是个引用,这下知道为何两个警告没了,就是因为这里使用了它们

好了,终于可以下载程序了!下载看看:


我ca,为何就只有任务2?我的1呢?去哪了????

PS:同事早就下班了,快12点了,今天就到这里

这篇关于FreeRTOS系列(一) STM32 FreeRTOS移植,不就是打个勾吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641340

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类