xivisi 发表于 2012-4-15 08:24:36

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:09

牛人呀,下载了看下...

xzp21st 发表于 2012-4-15 11:30:20

是按照时间片轮询?能简单说下原理不?

xivisi 发表于 2012-4-15 11:30:22

laujc 发表于 2012-4-15 08:32 static/image/common/back.gif
牛人呀,下载了看下...

没什么牛不牛的,也就那么回事,只是汇编不熟悉

xivisi 发表于 2012-4-15 11:31:30

xzp21st 发表于 2012-4-15 11:30 static/image/common/back.gif
是按照时间片轮询?能简单说下原理不?

不是按时间片轮询,各个task主动释放,时间片轮询的功能还没加

laujc 发表于 2012-4-15 11:34:55

xivisi 发表于 2012-4-15 11:30 static/image/common/back.gif
没什么牛不牛的,也就那么回事,只是汇编不熟悉

其实C更难一些.
汇编如果知道指令及用法,是很容易懂的.

只汇编是和芯片相关的,不同的厂家不同而已.但是基本的指令及用法,大多相同或相似.

xzp21st 发表于 2012-4-15 13:55:41

既然拿出来分享了,希望楼主能加些注释哇,一条注释也木有啊。。。

xivisi 发表于 2012-4-15 14:05:53

本帖最后由 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:37

现在看不懂,学习中

xivisi 发表于 2012-4-16 18:45:40

adgj 发表于 2012-4-16 13:10 static/image/common/back.gif
现在看不懂,学习中

看啊看的就会了……{:3_51:} ,我就是这么过来的

adgj 发表于 2012-4-17 20:20:40

多谢楼主鼓励!我要加油了{:handshake:}

zhuwenwujy 发表于 2012-4-17 22:09:25

MARK,正想学这方面的东西呢,感谢楼主

zhuwenwujy 发表于 2012-4-17 22:10:46

楼主,初学者应该先从哪方面着手啊?好茫然啊……

xivisi 发表于 2012-4-18 08:01:39

本帖最后由 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:
在加一点:逻辑思维,这个需要多接触,多练习
搞技术的 没有哪个是笨蛋

hongdan0714j 发表于 2012-4-18 09:34:55

xivisi 发表于 2012-4-18 08:01 static/image/common/back.gif
需要的基础:
1、数据结构
2、C


LZ头像来自??

xivisi 发表于 2012-4-18 18:59:36

hongdan0714j 发表于 2012-4-18 09:34 static/image/common/back.gif
LZ头像来自??

仙剑奇侠传 四

xivisi 发表于 2012-4-19 21:34:12

晕了,不能继续编辑!

2012-04-19 21:32

增加TASK之间通信功能。


wb503059722 发表于 2012-4-19 22:20:31

楼主握个手,学习一下ucoss的应用

zhuwenwujy 发表于 2012-4-19 22:41:10

xivisi 发表于 2012-4-18 08:01 static/image/common/back.gif
需要的基础:
1、数据结构
2、C


恩恩,好的,谢谢指点

commshare 发表于 2012-5-11 17:27:42

强大的楼主!
页: [1]
查看完整版本: DIY 的RTOS,持续更新【最后更新:2012-04-16 22:36】