DIY 的RTOS,持续更新【最后更新:2012-04-16 22:36】
本帖最后由 xivisi 于 2012-4-16 22:37 编辑2012-04-15 08:24:36
莫名其妙的想做RTOS,昨天下午3点搞到晚上1点,放码补觉去
基于M3,示例采用KEIL,STM32F103
非抢占,轮询(改改就可以),任务列表用的数组(暂时使用数组,改链表也没啥问题)
内存使用编译器分配(就是没有内存管理{:tongue:} )
堆栈在定义时决定,最小64字节,
调度算法的函数独立出来,暂时只是简单实现,以后可能添加高级算法
2012-04-16 18:34:
更新,基于时间片轮询,可设置优先级,理论上优先级 2147483648 个级别,优先级调度算法很简单,优先级就是该TASK的时间片个数,只要不被打断,则其“时间片能量”用完了才调用其他TASK
添加调度TASK时屏蔽其它中断,防止高优先级中断造成寄存器压栈错误。
TASK(TASK_NAME,TASK_CODE,TASK_ARGS,PRIORITY,STACK_SIZE)
为TASK定义宏
TASK_NAME,为该TASK的标识符,为TaskCreate 的传入参数(目前需要强制转换TaskType*)
TASK_CODE,为该TASK的执行函数,请将该函数设置为无限循环,否则代码跑飞
TASK_ARGS,为该TASK的传入参数。
PRIORITY,为优先级,时间片能量
STACK_SIZE,栈大小,以最小32字节的倍数定义,实际字节数为64+STACK_SIZE*32,所以即使将该值设置为0也可以正常运行
2012-04-16 21:06
1,解决非无限循环任务,的问题
2012-04-16 22:36
洗了一个澡
1,解决当前任务主动让出时间片,导致下一任务运行不足一个时间片,甚至被挤掉的问题
主程序样例:#include "Schedule.h"
void OnlyOnce(void* Arg);
void GiveUpSomeTime(void* Arg);
void NeverGiveUp(void* Arg);
//TASK(TASK_NAME,TASK_CODE,TASK_ARGS,PRIORITY,STACK_SIZE)
TASK(Task_OnlyOnce,OnlyOnce,0,1,0);
TASK(Task_GiveUpSomeTime,GiveUpSomeTime,33,1,0);
TASK(Task_NeverGiveUp,NeverGiveUp,0,1,0);
int main()
{
STM32_HSE_CLK_INIT();
TaskCreate((TaskType*)&Task_OnlyOnce);
TaskCreate((TaskType*)&Task_GiveUpSomeTime);
TaskCreate((TaskType*)&Task_NeverGiveUp);
TaskSchedule();
}
void OnlyOnce(void* Arg)
{
unsigned int Temp=0XFFFF;
while(Temp--);
}
void GiveUpSomeTime(void* Arg)
{
unsigned int Temp;
unsigned int Temp2=(unsigned int)Arg;
while(1)
{
Temp++;
if(Temp%Temp2==0)
{
SVC_WAIT_CALL();
}
}
}
void NeverGiveUp(void* Arg)
{
unsigned int Temp;
while(1)
{
Temp++;
}
}
重要说明:该RTOS不完善,不建议实际使用到项目中,仅建议初学者学习 牛人呀,下载了看下... 是按照时间片轮询?能简单说下原理不? laujc 发表于 2012-4-15 08:32 static/image/common/back.gif
牛人呀,下载了看下...
没什么牛不牛的,也就那么回事,只是汇编不熟悉 xzp21st 发表于 2012-4-15 11:30 static/image/common/back.gif
是按照时间片轮询?能简单说下原理不?
不是按时间片轮询,各个task主动释放,时间片轮询的功能还没加 xivisi 发表于 2012-4-15 11:30 static/image/common/back.gif
没什么牛不牛的,也就那么回事,只是汇编不熟悉
其实C更难一些.
汇编如果知道指令及用法,是很容易懂的.
只汇编是和芯片相关的,不同的厂家不同而已.但是基本的指令及用法,大多相同或相似. 既然拿出来分享了,希望楼主能加些注释哇,一条注释也木有啊。。。 本帖最后由 xivisi 于 2012-4-15 14:11 编辑
xzp21st 发表于 2012-4-15 13:55 static/image/common/back.gif
既然拿出来分享了,希望楼主能加些注释哇,一条注释也木有啊。。。
{:3_59:} 习惯了,加些其他功能,好了再传 现在看不懂,学习中 adgj 发表于 2012-4-16 13:10 static/image/common/back.gif
现在看不懂,学习中
看啊看的就会了……{:3_51:} ,我就是这么过来的 多谢楼主鼓励!我要加油了{:handshake:} MARK,正想学这方面的东西呢,感谢楼主 楼主,初学者应该先从哪方面着手啊?好茫然啊…… 本帖最后由 xivisi 于 2012-4-18 08:05 编辑
zhuwenwujy 发表于 2012-4-17 22:10 static/image/common/back.gif
楼主,初学者应该先从哪方面着手啊?好茫然啊……
需要的基础:
1、数据结构
2、C
3、ARM汇编我参考的是《Cortex-M3 权威指南》 这个比《Cortex-M3 技术参考手册》好
PS:
在加一点:逻辑思维,这个需要多接触,多练习
搞技术的 没有哪个是笨蛋 xivisi 发表于 2012-4-18 08:01 static/image/common/back.gif
需要的基础:
1、数据结构
2、C
LZ头像来自?? hongdan0714j 发表于 2012-4-18 09:34 static/image/common/back.gif
LZ头像来自??
仙剑奇侠传 四 晕了,不能继续编辑!
2012-04-19 21:32
增加TASK之间通信功能。
楼主握个手,学习一下ucoss的应用 xivisi 发表于 2012-4-18 08:01 static/image/common/back.gif
需要的基础:
1、数据结构
2、C
恩恩,好的,谢谢指点 强大的楼主!
页:
[1]