400行程序写一个实时操作系统RTOS(开篇)

790 阅读3分钟

        笔者之前突发奇想,准备写一个极其微小的实时操作系统内核,在经过数天的努力后,这个RTOS诞生了。令读者比较意外的是,它的程序只有400行左右。但就是这短短的400行,完成了动态内存管理、多线程、优先级、临界区、低功耗管理、调度延时等功能。与FreeRTOS内核相比,它的功能已经大差不差了。

        麻雀虽小,五脏俱全。所以笔者给它命名为skRTOS_Sparrow,寓意它的微小性和灵活性。
笔者准备把Sparrow作为一个学习用途的RTOS,并在接下来的博客中讲解它的原理,由于它只有内核,并不具有队列、信号量等应用,作为一个RTOS,它显然是不完整的,有兴趣的读者可以尝试自己完成。(笔者也许哪一天会添加这些功能,但具体是哪一天呢?笔者也不知道( > <)。 )
好的,现在先让我们进行一个小实验:对sparrow进行移植并使用。

        读者需要一块单片机,比如stm32f103c8t6最小系统板。例如这种:

                                        
如果读者需要sparrow的源码,可以到我的github: github.com/skaiui2/SKR…这里下载。     下载完后,让我们打开cubemx:新建工程,mcu选择stm32f103c8t6。

rcc设置如下:

中断设置如下:

这里是重点!!!:不要设置为systicks时钟,这与RTOS是冲突的。debug要设置为serial wire,不然mcu下载后会卡死!

再把PC13设置为output:

时钟直接给72就完事了:

完成这些后,笔者可以点击新建工程了。现在让我们开始移植并且简简单单点个灯。

打开stm32f1xx_it.c文件,注释掉SVC_Handler 、PendSV_Handler、SysTick_Handler这三个中断。

笔者使用的编辑器是clion,不过没有任何区别,笔者用keil也是一样的。

keil是一个很好的开发软件,只是读者实在是受不了keil的画风才选择放弃keil。

现在读者打开sparrow源码,找到sparrow.c文件,直接ctrl a然后ctrl c复制全部代码,然后粘贴到main.c中,例如粘贴在

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

这两行代码后面:

然后在task area开头的注释下面添加这些代码:


//Task Area!The user must create task handle manually because of debugging and specification
TaskHandle_t tcbTask1 = NULL;
TaskHandle_t tcbTask2 = NULL;

void led_bright( )
{
    while (1) {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        TaskDelay(1000);
    }
}

void led_extinguish( )
{
    while (1) {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
        TaskDelay(500);
    }
}

void APP( )
{

    xTaskCreate(    led_bright,
                    128,
                    NULL,
                    2,
                    &tcbTask1
    );

    xTaskCreate(    led_extinguish,
                    128,
                    NULL,
                    3,
                    &tcbTask2
    );
}

main函数这样写即可:

读者对代码进行编译,然后下载到单片机中,可以发现stm32f103c8t6上的PC13引脚开始一闪一闪亮发光。

以上就是skRTOS_Sparrow的移植及基本使用,笔者在接下来的博客中将会讲解它的原理,并且指导读者如何一步步写出一个sparrow RTOS!

​Sparrow源码:skaiui2/SKRTOS_sparrow at source (github.com)

已经移植好的工程,包括hal库版本和标准库版本:skaiui2/SKRTOS_sparrow: Lightweight rtos inspired by SKRTOS (github.com)