原创 基于AVR的一套调度核

2008-12-13 20:45 4622 10 11 分类: MCU/ 嵌入式

以前玩AVR时写的一套最基本的调度核,应用在一些系统中,静态分配,使用起来很方便,要占用一个定时器。实现了任务延时、任务挂起、任务恢复、资源分配。具体的参见附件,下面做一些简单的说明。

定义时钟滴答值,单位ms
#define SYS_TICK_FREQ    1000

位操作定义
#define sbi(Port, Bit)    (Port |= (1<<Bit))   
#define cbi(Port, Bit)    (Port &= ~(1<<Bit))   
#define eoi(Port, Bit)    (Port ^= (1<<Bit))

定义的任务数量
#define N        5
定义的单个任务占用的RAM
#define S        250

定义任务属性结构
typedef struct TASK_CONTROL_BLOCK
{
    volatile unsigned int ui_task_entry;
    volatile unsigned int ui_task_tick;
    volatile unsigned char uc_task_property;
    volatile unsigned char uc_task_stack[S];
}
STRUCT_TCB;

STRUCT_TCB TCB[N];

定义的任务数量和当前的任务检索值
volatile unsigned char     uc_task_quantity;
volatile unsigned char    uc_task_current;

调度核中的所有函数
void OS_Init(void);
void OS_TaskStart(void);
void OS_TaskSchedule(void);
void OS_TaskDelay(unsigned int ui_ms);
void OS_TaskCreate(void(*pTaskEntry)(void));

#define OS_TaskPause(task_id, b_pause)                \
        b_pause==false?                                \
        cbi(TCB[task_id].uc_task_property, 7):        \
        sbi(TCB[task_id].uc_task_property, 7)        \

#define OS_IsTaskPause(task_id)                                    \
        TCB[task_id].uc_task_property & 0x80?                    \
        true:                                                    \
        false                                                    \

另外处理临界时的定义,具体见附件
#define PUSH_ALL()
#define POP_ALL()

在调用时比较简单,比如:
int main(void)
{
    OS_Init();
   
    OS_TaskCreate(Task_1);
    OS_TaskCreate(Task_2);
    OS_TaskCreate(Task_3);

    OS_TaskStart();
   
    return(0);
}

void Task_1(void)
{

TaskStart:

    // 你的代码

    OS_TaskDelay(0);
    goto TaskStart;
}

void Task_2(void)
{

TaskStart:

    // 你的代码
    eoi(DO8, LAMP_R);
    OS_TaskDelay(500);

    goto TaskStart;
}

void Task_3(void)
{

TaskStart:

    // 你的代码
    eoi(DO8, LAMP_G);
    OS_TaskDelay(500);

    goto TaskStart;
}

上面这个例子就实现了两个指示灯的定时闪烁,调用OS_TaskDelay函数将立刻执行调度函数,并判断当前任务的滴答值进行处理,需要说明的是Task_1中的OS_TaskDelay参数只能为0,这个任务相当于整个调度系统的IDLE任务。

附件:https://static.assets-stash.eet-china.com/album/old-resources/2008/12/13/e3eb1a4a-2c87-4ea9-b024-4c8cb39f5983.rar



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1065177 2009-4-1 18:04

楼主高手,想想自己,一事无成。
相关推荐阅读
用户1206224 2010-11-22 08:05
基于STM32的智能交通信号机
基于STM32的智能交通信号机,有兴趣探讨的朋友可以跟我联系...
用户1206224 2010-03-26 21:30
STM32 USB 源代码及笔记下载 修复贴
今年比较忙,很少来空间,看到大家的留言,故发布此STM32 USB 源代码及笔记下载修复贴STM32 USB固件以及上位机驱动、应用程序源程序:笔记:...
用户1206224 2010-03-26 21:28
STM32 SD卡FATFS移植
最近试玩了STM32用SPI方式操作SD卡,这样就涉及到文件系统,搜索到几种支持FAT16/32的文件,综合考虑,最后选择了完全开源、免费的FATFS,版本是R0.07e,该版本支持长文件名:Wind...
用户1206224 2009-06-02 08:53
基于STM32的USB程序开发笔记(一)
第一篇:需要准备的一些资料1:STM32的参考手册,这对于设备底层USB的硬件配置以及事件驱动机制的了解尤为重要,你需要了解各个寄存器的功能以及如何操作,比如CNTR、ISTR、EPnR、DADDR等...
用户1206224 2009-06-02 08:51
STM32的16路ADC的USB高速采集
STM32的16路ADC的USB高速采集前提:本例基于STM32F103VBT6平台功能说明:16路AD转换并将结果通过USB发送至PC,PC端驱动为定制编写,并附带一款测试软件。附件说明:1:STM...
用户1206224 2009-03-28 09:50
第二版STM32F103ZET6最小系统板实物照片
第二版STM32F103ZET6最小系统板实物照片,PCB工艺不是好,手工焊接后也很脏。第二版硬件上没有问题,各项都调试通过,但综合多种因素,该套小板原则上不会制作并对外,但还是非常感谢大家这段时间对...
EE直播间
更多
我要评论
1
10
关闭 站长推荐上一条 /3 下一条