手写一个RTOS.1

2021-12-20 15:43:02 浏览数 (1)

最近腾讯有个嵌入式的比赛,我有点心动,但是我又有点怕做不出来东西。所以我在这里立下宏愿(有点日宣),手写一个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.

0 人点赞