DIY:给单片机写个实时操作系统内核!
SP = (uint16_t)OS_CurrentThread->
else if( (pmcb->Status==OS_MEMORY_STATUS_IDLE) && (pmcb->Size >
if(pmcb->
pmcb->
pmcb2->
pmcb2->Next=pmcb->
pmcb2->
pmcb2->Size = pmcb->
pmcb->
pmcb->
pmcb->
pmcb=pmcb->
pmcb->
OS_MemoryIdleCount += pmcb->
if(pmcb->
if(pmcb->Front->
pmcb->Front->Size += pmcb->
pmcb->Front->Next = pmcb->
pmcb=pmcb->
OS_MemoryIdleCount += pmcb->
if(pmcb->
如果下一块内存块处于空闲状态,则进行合并操作
if(pmcb->Next->Status==OS_MEMORY_STATUS_IDLE)
{
pmcb->Size += pmcb->Next->Size ;
pmcb->Next = pmcb->Next->Next ;
OS_MemoryIdleCount += pmcb->Size ;
}
}
}
#endif
这种分配策略虽然实现简单,但是缺点就是容易产生内存碎片,即随着时间推移,可用内存会越来越碎片化,最后导致想要申请足够大的内存块都没办法。。。
/********************************************************************************/
至此,一个简单的单片机使用的操作系统模型就算完成了,应用在AVR单片机中,下面进入测试阶段:
因为还没有完成线程通信模块还抢占式算法,所以目前只能执行轮询多任务操作。我写了一个测试程序,就是创建三个流水灯程序(是不是觉得写个操作系统就用来跑流水灯太浪费了,哈哈),让它们同时闪,在PROTEUS中仿真查看
在AVR STUDIO5开发环境中编写,代码如下:
#include "includes.h"
#include "OS_core.h"
#define STACK_SIZE 80 //定义每个任务的人工堆栈大小
//定义三个任务各自的人工堆栈
uint8_t Test1Stack[STACK_SIZE];
uint8_t Test2Stack[STACK_SIZE];
uint8_t Test3Stack[STACK_SIZE];
//定义三个任务各自的线程控制块
OS_TCB Task1;
OS_TCB Task2;
OS_TCB Task3;
//线程1让PB口闪烁
void Test1(void *p)
{
uint8_t i;
DDRB=0XFF;
PORTB=0xff;
SREG|=0X80;
while(1)
{
for(i=0;i<8;i++)PORTB=1}
}
//线程2让PC口闪烁
void Test2(void *p)
{
uint8_t i;
DDRC=0xff;
PORTC=0XFF;
SREG|=0X80 ;
while(1)
{
for(i=0;i<8;i++)PORTC=1
}
}
//线程3让PD口闪烁
void Test3(void *p)
{
uint8_t i;
DDRD=0XFF;
PORTD=0xff;
SREG|=0X80;
while(1)
{
for(i=0;i<8;i++)PORTD=1
}
}
//MAIN函数
int main(void)
{
uint8_t i = 0x77;
//初始化操作系统
OS_Init();
//初始化线程控制块并创建任务
OS_ThreadInit(&Task1,Test1Stack,STACK_SIZE,5,0);
OS_ThreadCreate(&Task1,Test1,&i);
OS_ThreadInit(&Task3,Test3Stack,STACK_SIZE,5,0);
OS_ThreadCreate(&Task3,Test3,&i);
OS_ThreadInit(&Task2,Test2Stack,STACK_SIZE,5,0);
OS_ThreadCreate(&Task2,Test2,&i);
//初始化定时器
OS_TimerInit();
//启动内核
OS_KernelStart();
//正常的话程序永远不会执行到这里!!!
while(1);
}
OK,开始调试咯!打开PROTEUS连线,LOAD程序,然后运行。。。。
成功同时运行三个流水灯程序!太棒了!接下来在这个内核的支持下你就可以创作你的应用程序了,使用内核提供的线程创建函数你可以创建N多个线程,当然了,必须在内存可接受的范围内。利用内存分配函数你可以动态申请和释放内存了。再也不用为DELAY()这种浪费CPU效率的作法郁闷很久了。上面所说的所有代码都开源,想看的同学发邮件到我EMAIL: wfm2012@126.com 索要
下次有空再作一些应用范例来玩玩
DIY单片机实时操作系统内 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)