本文主要是介绍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移植,不就是打个勾吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!