标题:
MCU_OS调度器的实现(微操作系统程序)
[打印本页]
作者:
timixiaoyouxi
时间:
2022-1-9 18:38
标题:
MCU_OS调度器的实现(微操作系统程序)
MCU的微操作系统,简单来说就是一个算法,而任何算法都是是基于数据结构的
学习大型OS,还是需要数据结构基础的,对于非软件专业的人,可能没有学过。。。。。。
还好,有微小的算法系统,可以实现MCU软件的设计,这个比较容易理解,需要的可以讨论,
这个是基于一本书上的实例代码,把他的主要内容总结了一下,下载可以直接套用, 自己再编写也没多少代码。。。。。。。。。。。。。。。。。。。
单片机源程序如下:
#include "OS.h"
// 中断服务函数 ,没歌1s 来调度这个函数
//调度器的实现
void SCH_Update()
{
unsigned char Index;
for(Index =0;Index < SCH_MAX_TASKS;Index++)
{
if(SCH_tasks_G[Index].pTask) // 任务存在,不为0 ,这个涉及,任务的删除
{
//判断这个任务是否要执行
if(0 == SCH_tasks_G[Index].Delay)
{
SCH_tasks_G[Index].RunMe += 1; //这个任务要运行
//判断这个任务是周期性,还是单次任务
if(SCH_tasks_G[Index].Period)
{
SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
}
}
else
{
SCH_tasks_G[Index].Delay -= 1;
}
}
}
}
//任务的添加
unsigned char SCH_Add_Task(void (*pTask)(),const unsigned int Delay,const unsigned int Period)
{
unsigned char Index = 0;
while((SCH_tasks_G[Index].pTask != 0)&&(Index < SCH_MAX_TASKS))
{
Index++;
}
if(Index == SCH_MAX_TASKS)
{
//ERROE_CODE =
return SCH_MAX_TASKS;
}
SCH_tasks_G[Index].pTask = pTask;
SCH_tasks_G[Index].Delay = Delay;
SCH_tasks_G[Index].Period = Period;
SCH_tasks_G[Index].RunMe = 0;
return Index;
}
// 任务的删除
unsigned char SCH_Delete_Task(Task_ID)
{
unsigned char Return_Code = 0;
//判断这个地方的函数指针是否为0
if(0 == SCH_tasks_G[Task_ID].pTask)
{
// 这里没有任务.....
//
//设置全局错误变量 ,也可以不要这个错误机制
//Error =
Return_Code = 0;
}
else
{
Return_Code = 1;
}
SCH_tasks_G[Task_ID].pTask = 0x0000;
SCH_tasks_G[Task_ID].Delay = 0;
SCH_tasks_G[Task_ID].Period = 0;
SCH_tasks_G[Task_ID].RunMe = 0;
return Return_Code;
}
//216
void SCH_Dispatch_Tasks()
{
unsigned char Index;
//所有的任务轮训之后,再释放CPU
for(Index = 0;Index < SCH_MAX_TASKS;Index++)
{
if(SCH_tasks_G[Index].RunMe > 0)
{
(*SCH_tasks_G[Index].pTask)(); //执行任务
SCH_tasks_G[Index].RunMe -= 1; // 复位/减小RunMe的标志
//周期性任务会自动再次执行
// 如果这个是单次任务,将他从队列中删除,不是单次任务,就需要手动删除
if(0 == SCH_tasks_G[Index].Period)
{
SCH_Delete_Task(Index);
}
}
}
}
//启动调度器
void SCH_Start()
{
//EA= 1;
;
}
void AX()
{
}
int main()
{
//
unsigned char Task_ID;
Task_ID = SCH_Add_Task(AX,1000,0);
SCH_Start();
while(1)
{
SCH_Dispatch_Tasks();
}
}
复制代码
Keil代码下载:
onr.zip
(12.68 KB, 下载次数: 18)
2022-1-9 18:38 上传
点击文件名下载附件
MCU_OS
下载积分: 黑币 -5
作者:
人工置顶员
时间:
2022-1-12 01:30
顶一下
作者:
heicad
时间:
2022-1-13 00:17
这种思路对于大项目还是很有帮助的
作者:
嘻哈啊
时间:
2022-3-1 20:09
SCH_Start()里该运行些什么呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1