最近腾讯有个嵌入式的比赛,我有点心动,但是我又有点怕做不出来东西。所以我在这里立下宏愿(有点日宣),手写一个freertos出来,然后我就报名。
代码语言:javascript复制https://github.com/FreeRTOS/FreeRTOS-Kernel
就看内核就好 这个是市场占有最多的rtos吧。这个作为参考资料。然后也不用设备直接使用Keli5来软件仿真就好。 当然我还没有强到凭空写一个的水平,也看了很多的资料才写的。
代码语言:javascript复制https://www.freertos.org/FreeRTOS-quick-start-guide.html
还有几本pdf
代码语言:javascript复制https://www.freertos.org/Documentation/RTOS_book.html
很简单的英语,看技术书就是简单
代码语言:javascript复制https://sourceforge.net/projects/freertos/files/FreeRTOS/V9.0.0/source-code-for-book-examples.zip/download
随书源码
代码语言:javascript复制https://sourceforge.net/projects/freertos/files/FreeRTOS/
对了,以往的源码在这里下载。
我相信很多人第一次接触rtos的时候,尤其是freertos的时候,都迷惑一些新变量,到底是什么鬼。。。
去看这里
都是基于GCC的芯片
各种各样的,我们就看ARM的就行
如果用VSCode看源码可以在这里改一个编译器的目录
其实就是下面的一些重新定义
GCC的数据类型
RTOS的
看后面的,无符号的数
就看这么多
在FreeRTOS中,int型从不使用,只使用short型和long型。在Cortex-M内核的MCU中,short为16位,long为32位。
在FreeRTOS中,定义变量时往往会把变量的类型当作前缀加在变量上,这样做的好处是让用户一看到这个变量就知道该变量的类型。比如char型变量的前缀是c,short型变量的前缀是s,long型变量的前缀是l,portBASE_TYPE类型变量的前缀是x。还有其他的数据类型,比如数据结构、任务句柄、队列句柄等定义的变量名的前缀也是x。如果一个变量是无符号型的,那么会有一个前缀u,如果是一个指针变量,则会有一个前缀p。因此,当我们定义一个无符号的char型变量时会加一个uc前缀,当定义一个char型的指针变量时会加一个pc前缀。
这就是几个例子,你看x就是void的意思
还是那句话,都包装过
函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数,则会加一个prv(private)的前缀。特别地,在函数名中加入了函数所在的文件名,这将帮助用户提高寻找函数定义的效率并了解函数作用,具体举例如下:
1)vTaskPrioritySet()函数的返回值为void型,在task.c文件中定义。
2)xQueueReceive()函数的返回值为portBASE_TYPE型,在queue.c文件中定义。
3)vSemaphoreCreateBinary()函数的返回值为void型,在semphr.h文件中定义。
可以验证一下
宏均由大写字母表示,并配有小写字母的前缀,前缀用于表示该宏在哪个头文件定义。
验证通过
0,1的定义
接着开始写了,这里要先建立一些文件夹,保证我们的项目结构的正确。
这样的安排
我这里就建立好了,骨架文件在Github了
KELI发现还没有安装,一定是5哦~
害,换了给电脑,没有了,还得折腾环境,烦。。。
安装好的样子
建立一个文件夹
选一个内核就好
点击这里
建立好的样子
加入我们的目录
就是这样的
在外部建立main和readme
最终这样的
首次编译报错,假如你没有main文件的话
一个工程如果没有main()函数是无法编译成功的,因为系统在开始执行时先执行启动文件中的复位程序,复位程序里面会调用C库函数__main,__main的作用是初始化系统变量,如全局变量、只读的变量、可读可写的变量等。__main最后会调用__rtentry,再由__rtentry调用main()函数,从而由汇编进入C的世界,这里面的main()函数就需要我们手动编写
这里我就写一次,使用VSCode来编写,KELI这里刷新使用
写个这就行
设置我们的仿真
这里是自己加的启动文件
keli在这里
如果code里面改完,keli里面会提示
仿真的晶振频率和默认的不一样,改一下
代码语言:javascript复制#define __HSI (8000000UL)
#define __XTAL (5000000UL)
#define __SYSTEM_CLOCK (5*__XTAL)
// 5x5000000 = 25MHz
设置里面也要改
需要把我们的头文件加入在这里
到现在为止就建立好了一个仿真工程了
因为我也不会起名字,new-rtos是我给这个rtos起的名字。文章里面的代码书籍都在Github了。
代码语言:javascript复制https://github.com/yunswj/new-rtos
欢迎star.