Skip to content

Commit 57c1211

Browse files
committed
feat: rewirte table version
1 parent 312b4ee commit 57c1211

File tree

4,896 files changed

+3501
-2513395
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4,896 files changed

+3501
-2513395
lines changed

README.md

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@
22

33
SKRTOS_sparrow内核的定位是学习型RTOS,项目的重点在于内核设计相关的文档教程。
44

5-
### 使用手册
6-
7-
移植与使用,请参考使用手册。
8-
9-
[使用手册](USER_MANUAL.md)
10-
11-
12-
135
## 说明
146

157
项目下有两个分支:
@@ -32,10 +24,48 @@ kernel:源码
3224

3325

3426

35-
### 版本
27+
## 版本
3628

3729
内核现在具有四个版本:数表版本(Table)、链表版本(List)、红黑树版本(RBtree)、响应EDF版本(rbtreeEDF)。
3830

31+
也可以把这四个版本划分为:学习版、使用版、实验版、尝试版。
32+
33+
四个版本中支持的编译器和平台正在维护更新中,目前默认支持的架构是arm cm3,默认支持的编译器为gcc。
34+
35+
#### 数表版本
36+
37+
只支持32个以下的任务,且不支持同优先级,该版本支持keil、gcc、IAR多种编译器,其中不带IPC版本仅400行代码。
38+
39+
[使用手册](UserManual/tableUser.md)
40+
41+
#### 链表版本
42+
43+
支持同优先级,对支持的任务数量没有限制,该版本接口部分可参考数表版本进行修改。
44+
45+
#### 红黑树版本
46+
47+
支持同优先级,但不支持时间片,其他功能与链表版本相同。
48+
49+
以上三个版本的设计思想并没有任何区别。
50+
51+
#### 响应EDF版本
52+
53+
在传统EDF算法上的改进,强调系统的周期性与可预测性,支持arm cortex A7架构。
54+
55+
另外三个版本:[使用手册](UserManual/other.md)
56+
57+
**适用范围**
58+
59+
数表版本:学习用途或资源有限的条件。
60+
61+
链表版本:完成度较高,适合大多数场景。
62+
63+
红黑树版本:适用于大量任务频繁搜索、插入和删除操作的场景。
64+
65+
响应EDF版本:适用于强调周期性与可预测性的场景,目前只进行了一些简单的测试,功能还不稳定,目前只是一个玩具。
66+
67+
### 版本说明
68+
3969
**本项目不再进行较大更新,而是注重于维护目前的四个版本**,接下来要做的工作有:
4070

4171
1.**优化不同版本的代码**,完善功能,修复bug。

UserManual/other.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# 使用手册
2+
3+
大部分功能与数表版本相同,基础功能请参考数表版本。
4+
5+
## 链表版本
6+
7+
链表版本内核是在数表版本内核上的拓展,增加功能如下:
8+
9+
### 链表
10+
11+
提供基本的加入和删除链表节点功能
12+
13+
```
14+
15+
void ListInit(TheList *xList);
16+
void ListNodeInit(ListNode *node);
17+
void ListAdd(TheList *xList, ListNode *new_node);
18+
void ListRemove(TheList *xList, ListNode *rm_node);
19+
```
20+
21+
创建的链表为环形链表。
22+
23+
24+
25+
### 时间片
26+
27+
可自定义时间片,设置时间片的周期是1ms,时间片用完后再会轮转到下一个任务。时间片只针对同优先级任务有效
28+
29+
```
30+
31+
void xTaskCreate( TaskFunction_t pxTaskCode,
32+
const uint16_t usStackDepth,
33+
void * const pvParameters,
34+
uint32_t uxPriority,//可设置同优先级
35+
TaskHandle_t * const self,
36+
uint8_t TimeSlice)//可设置不同时间片
37+
38+
```
39+
40+
### 互斥锁
41+
42+
正常使用互斥锁即可,发生优先级反转时持有锁的任务会暂时提升优先级至阻塞任务中最大优先级。
43+
44+
45+
46+
## 红黑树版本内核
47+
48+
红黑树版本支持同优先级,但不支持时间片功能。
49+
50+
**同优先级支持抢占**
51+
52+
两个任务配置为相同优先级时,后加入就绪树的任务会获得CPU执行权,如果没有同优先级或更高优先级的任务变为就绪态,该任务会一直执行。
53+
54+
**其他功能与链表版本相同。**
55+
56+
调度算法使用缓存指针设计,具有O(1)时间复杂度。
57+
58+
## 响应EDF版本
59+
60+
在传统EDF算法的基础上添加了双阈值,使用低通滤波计算任务平滑执行时间,其中加权指数设置为对历史数据敏感。
61+
62+
### 创建任务
63+
64+
```
65+
void taskA()
66+
{
67+
while (1) {
68+
uint32 time1 = TaskEnter();//返回进入时间,但只返回绝对时钟的低32位
69+
任务内容
70+
uint32_t time2 = TaskExit();//返回退出时间,但只返回绝对时钟的低32位,并阻塞任务直到下一个周期
71+
}
72+
}
73+
74+
75+
void APP()
76+
{
77+
TaskCreate( taskA,//任务函数名称
78+
256,//任务栈大小
79+
NULL,//任务函数参数
80+
20,//周期,每20ms执行一次
81+
1,//响应阈值
82+
100,//截止阈值,任务执行超过阈值视为失败
83+
&tcb1//参数
84+
);
85+
}
86+
87+
88+
89+
int main(void)
90+
{
91+
初始化
92+
SchedulerInit();
93+
APP();
94+
SchedulerStart();
95+
96+
}
97+
98+
```
99+
100+
### 平滑时间估计
101+
102+
TCB_t结构体中SmoothTime字段将会计算任务的平滑执行时间,读者在调试时打印即可查看,为保证时间精度,**实际时间为SmoothTime字段右移16位得到的值。**
103+
104+
平滑执行时间对历史数据敏感,反映长期执行时间,这是因为在计算时,历史执行数据的权重远大于当前数据权重。
105+
106+
## 结语
107+
108+
总功能如上,目前的Sparrow RTOS只是一个多任务调度内核,并不具有丰富的服务,不过读者可以根据需要添加或修改某些功能。
109+
110+
如果读者在使用过程中发现了某些bug,或者有某些建议,欢迎反馈!
111+
112+
113+
114+
115+
116+
117+

0 commit comments

Comments
 (0)