400行程序写一个实时操作系统RTOS(开篇)
笔者之前突发奇想,准备写一个极其微小的实时操作系统内核,在经过数天的努力后,这个RTOS诞生了。令读者比较意外的是,它的程序只有400行左右。但就是这短短的400行,完成了动态内存管理、多线程、优先级、低功耗管理、调度延时等功能。与FreeRTOS内核相比,它的功能已经大差不差了。
麻雀虽小,五脏俱全。所以笔者给它命名为skRTOS_Sparrow,寓意它的微小性和灵活性。
笔者准备把Sparrow作为一个学习用途的RTOS,并在接下来的博客中讲解它的原理,由于它只有内核,并不具有队列、信号量等应用,作为一个RTOS,它显然是不完整的,有兴趣的读者可以尝试自己完成。(笔者也许哪一天会添加这些功能,但具体是哪一天呢?笔者也不知道( > <)。 )
好的,现在先让我们进行一个小实验:对sparrow进行移植并使用。
读者需要一块单片机,比如stm32f103c8t6最小系统板。例如这种:
如果读者需要sparrow的源码,可以到我的github:https://github.com/skaiui2/SKRTOS_sparrow/tree/source这里下载。
下载完后,让我们打开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!