OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 559|回复: 0

NOS调度器 — 专为嵌入式应用实现的任务调度器!!!

[复制链接]

  离线 

1

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-6-19
在线时间
2 小时
发表于 2018-5-14 10:06:58 | 显示全部楼层 |阅读模式
本帖最后由 zhaingbo 于 2018-5-14 10:06 编辑

嵌入式开发过程中程序结构的组织一直是个问题。大多数嵌入式操作系统提供完整的调度框架,将程序以任务的方式组织实现,极大方便了应用实现。但嵌入式操作系统本身有一定的复杂性,需要些学习成本。

NOS调度器基于嵌入式MCU提供的一个定时器模块,实现了任务的轮询调度框架;支持任务的轮询调度,同时兼顾了硬实时任务调度。其所需硬件资源及代码量都是极少的。框架简单、易学易用。

项目托管在coding:https://coding.net/u/zhaingbo/p/ ... ter/inc?public=true

下文是“NOS调度器的项目说明”。





NOS概述
NOS is Not an OS.
NOS 是一个基于时间片轮转的简单调度器。 它提供了一组极其简单的调度器接口,以完成系统初始化/启动、添加任务、运行调度器,以及更新调度器状态操作。 调度器可以实现任务的周期性调度,针对任务的周期性,NOS支持任务的普通周期或硬实时周期性调度。
使用说明
NOS 调度器仅包含nos.h和nos.c两个文件,可以直接将之拷贝至项目工程中即可。
模块占用内存极少(约230Byte ROM + N*16Byte RAM)。
概念说明
任务 NOS调度器所指任务是具备typedef void (*ptask_t)(void*)接口类型的普通函数。 它接收一个 void* 类型的数据作为函数形参,可用于一般消息在任务间的传递。
周期性 NOS调度支持硬实时周期(NOS_SCH_ISR)和(或)普通周期(NOS_SCH_NORMAL)。 对于NOS_SCH_ISR任务,任务的调度在定时器或SysTick中断服务中执行;对于NOS_SCH_NORMAL则在nos_run()流程中执行。
示例Demo
  • 系统主文件 main.c 相关初始化及任务添加操作。桩代码参见如下:
[C] 纯文本查看 复制代码
// @file main.c
int main(void)
{
    bsp_init();
    system_init();

    // 初始化系统
    nos_init();

    // 添加task_uart_send任务,调度频率500Hz,采用硬实时调度,立即调度
    nos_add_task(task_uart_send, NULL, NOS_SCH_FREQ_500HZ, 0, NOS_SCH_ISR);
    // 添加task_led任务,调度频率2Hz,采用普通周期调度,延时3周期调度
    nos_add_task(task_led,       NULL, NOS_SCH_FREQ_2HZ,   3, NOS_SCH_NORMAL);

    // 启动nos调度器
    nos_start();
    while (1) {
        // 运行调度器
        nos_run();
    }

    return 0;
}

  • 定时器中断处理中添加调度器更新驱动nos_update_isr。
[C] 纯文本查看 复制代码
@file system_it.c
void SysTick_Handler(void)
{
    nos_update_isr();
}

接口说明nos_init()
初始化调度器。
nos_start()
启动调度器,设置NOS启动标志。
nos_update_isr()
功能概述 更新调度器,用于更新任务表中所有任务状态 该接口属于ISR服务,应在系统定时器或SysTick中断服务中调用
入口参数 无
出口参数 status - 调度器实时状态
nos_run()
功能概述 运行调度器,该函数在while(true);循环中调用
入口参数 无
出口参数 调度器执行结果
nos_add_task()
功能概述 向NOS调度器中添加任务,将任务添加至任务列表的第一个空任务处。 当系统列表已满时,任务添加失败,返回(NOS_TASK_MAX)。
入口参数 task -- 任务名称; pdat -- 数据; period -- 执行周期; delay -- 任务需要延时执行; sched_t -- 任务调度类型 (NOS_SCH_ISR-中断模式, NOS_SCH_NORMAL-普通模式).
出口参数 tid_t 任务在NOS列表中的 ID,或( ERR_NOS_TOO_MUCH_TASK )

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-23 05:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */