skaiuijing

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
classDiagram
class MemoryManager {
+申请内存()
+释放内存()
}
class ThreadManager {
+创建线程()
}
class CriticalSection {
+进入临界区()
+退出临界区()
}
class PowerManager {
+低功耗模式()
}
class Scheduler {
+调度器()
+任务延时()
}
class IPCManager {
+消息队列()
+信号量()
+互斥锁()
}

IPCManager <|-- Scheduler
Scheduler <|-- CriticalSection
Scheduler <|-- PowerManager
ThreadManager <|-- MemoryManager

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

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

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

rcc设置如下:

img

中断设置如下:

img

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

img

再把PC13设置为output:

img

时钟直接给72就完事了:

img

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

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

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

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

img

img

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

1
2
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

这两行代码后面:

img

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//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函数这样写即可:

img

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

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