微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DIY:给单片机写个实时操作系统内核!

DIY:给单片机写个实时操作系统内核!

时间:11-29 来源:互联网 点击:

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 索要

下次有空再作一些应用范例来玩玩

上一篇:C++嵌入式开发
下一篇:单片机硬件心得

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top