自己写的非抢占式嵌入式操作系统ATOS,全c语言,移植太...
ATOS是一个非抢占式的嵌入式操作系统平台,采用事件机制驱动设计,任何应用的执行都是靠事件来触发。触发事件可以是外部设备、内部定时器、其它任务发送的邮箱、信号量等事件。系统内核分为底层事件扫描,任务调度管理两部分。底层事件用于扫描外设发生的事件,任务调度管理则实现任务切换、任务处理。任务按照事件触发先后顺序执行。ATOS也是具有优先级之分,优先级高的任务先运行。任务调度由调度周期来实现,在1个调度周期内,由事件发生的任务按照优先级高低依次运行。每个周期内,任务都有运行的机会,且每个任务只处理1个事件。ATOS完全是由c语言实现,移植方便,无需考虑不同硬件间复杂配置。ATOS具有丰富的开发模块库,为开发者提供方便,快捷、简单、稳定、可靠的嵌入式应用程序开发平台。
ATOS主要分为内核模块和基本外围模块两部分,内核模块是实现系统切换调度,为应用提供支撑的必不可少部分。外围模块则是为应用提供更为复杂应用的配置,方便用户使用。
ATOS内核可分为任务管理、事件管理、任务调度、邮箱管理、信号量管理、定时器管理、动态内存、中断管理等功能。
系统基本外围模块库包含IO扫描,LED闪烁,键盘扫描,存储支持,数据库等模块。 支持楼主,下次写代码就用楼主的OS,但关键是,代码呢? 分享操作系统源码哦,QQ;29130683
标记一下! 普通的51单片机也可以用? 支持,收藏备用 牛叉!等使用报告!如果好用!我也试试!谢谢 已经在很多项目中使用了。 当初写这个的目的就是为了偷懒,移植,复用。传统的抢占式rtos,都需要汇编来操作程序指针,堆栈指针,压栈,出栈,不同的CPU,编译环境,汇编代码还不一样,并且容易出错,由于普通的应用对实时性没有想象到的那么苛刻,就写了该系统。移植非常方便,该系统借鉴了ucOS,freeRTOS, OSCAL等不同操作系统的理念。 支持,收藏备用,谢谢楼主分享! 谢谢分享,收藏 谢谢。。。受教了 收藏备用 屌炸天了。 屌炸天了。 谢谢楼主分享,回去使用下。移植方便是最好不过的了 在PIC24F,PIC18F,STM32,FreeScale单片机上用过,产品停车场车位引导,温控器联网,户用多功能热量表,数据采集器,控制器,以太网网关,闸门检测控制器。 全C的,收藏了。 http://www.amobbs.com/forum.php?mod=redirect&goto=findpost&ptid=5632476&pid=8774090,控制器就是用这个系统做的 mark{:lol:} 占用多少flash和RAM 最少1K RAM, 4K FLASH。模块功能可裁剪 大家可以参考这个标题,控制器就是用这个系统做的。http://www.amobbs.com/forum.php?mod=redirect&goto=findpost&ptid=5632476&pid=8774090 楼主可上传一个STM32的MDK工程?一个任务LED闪烁,一个任务串口发送数据 最好能上传一个例子程序,这样学习起来快一些,简单的例子,包含你的所有功能就可以 tabc_123 发表于 2015-9-18 15:06
最好能上传一个例子程序,这样学习起来快一些,简单的例子,包含你的所有功能就可以 ...
赞同
发现I2C_WriteArray,I2C_ReadArray没有跨页处理 在上层中自己分页 赞同赞同 看到了,
//存储每页包含字节
#define MAX_NVM_SIZE_PER_PAGE (64)
呵呵 关于存储的代码函数 谢谢分享, 有空学习学习。 好东西收藏了!{:biggrin:} //读取记录表信息
void GetDeviceRecord(INT8U index, OS_DB_DEV *record)
{
INT16U number, logicId, offset;
//计算一页存储邻居节点的数量
number = MAX_NVM_SIZE_PER_PAGE / sizeof(OS_DB_DEV);
//计算当前节点是在哪一页
logicId = OS_NV_DB_TBL + (index / number);
//找到某页的修改位置
offset = (index % number) * sizeof(OS_DB_DEV);
//读取
OSNVMGet(logicId, offset, (INT8U *)record, sizeof(OS_DB_DEV));
} 收藏了,谢谢分享 谢谢楼主 下来试试 这么流弊的东东,自然得顶了。 顶一个,楼主大爱。 好东西收藏了!{:biggrin:} 之前也做过PIC的开发,有点基础,正好看看楼主是怎样写代码的。 收藏了,谢谢分享 收藏了,下来用用 看看代码质量,感觉不错. 谢谢楼主 下来试试 牛人!!!!!!! sdu_amayer 发表于 2015-9-18 11:30
分享操作系统源码哦,QQ;29130683
有例程没?? TI的OSAL,类似 嗯,研究下,有空用用。多谢 不错不错,全C的比较好看 有没有STM32F系列芯片的例程? 牛人!!!!!!! 例程都太大,都是具体应用。根据说明自己写吧,这样理解比较深些。可以附送一个任务函数例程。 最近QQ出现问题了,没法加入好友了,烦死了 嗯,研究下,有空用用。多谢 强人!!!
下载下来学习一下。 最近QQ出现问题了,没法加入好友了,烦死了 谢楼主无私!!!!!!!!! 这个好,一定试试 感谢分享,粗略看了一下, 不错, 楼主的代码很规范
待后续深入拜读, 空了试用一下
收藏学习下{:victory:} 顶楼主,有空好好学习下,感谢分享。 厉害了学习学习 赞一个,我也在搞os,大家多多交流{:lol:} 好东西收藏了! 好东西先收藏再学习研究.谢谢楼主分享. 感谢楼主无私的奉献,对于小单片机资源,又想上操作系统是非常好不过了,留着备用,不过对于小单片机来说RAM占用就有点偏大了 sdu_amayer 发表于 2015-9-18 17:36
最近QQ出现问题了,没法加入好友了,烦死了
代码的任务切换,是靠定时器吗? 代码的切换实际上就是一个while死循环,执行完一个任务再执行下一个任务,在任务队列中优先级最高的在前面 收藏了,研究支持一下! 收藏了,支持一下! 谢谢楼主, 学习了 请关注,后续会逐渐推出uip协议栈移植及应用 谢谢楼主,,,, sdu_amayer 发表于 2015-9-18 11:30
分享操作系统源码哦,QQ;29130683
没有一些具体mcu的demo不利于初学者入门的。大牛也不需要这些。个人建议而已 好东西!mark!!! 操作系统ATOS 希望楼主能提供该程序的STM32工程啊,这样方便我们研究啊 希望楼主能提供该程序的STM32工程啊,这样方便我们研究啊 这个要顶,厉害,下来看看 觉得思路不错,提供一个可以运行的例程,简单的串口,LED就行,这样大家上手也快。 谢谢分享,下载了研究下,等有机会也使用下试试 自然得顶了。 支持。。。赞一个 非常好的系统例程,学学, 非常好的系统例程,学学,为什么每次都要发二次才能发出去啊, 收藏,向楼主学习! 科技猎人 发表于 2015-9-18 19:46
赞一个,我也在搞os,大家多多交流
我记得你的这个帖子空闲任务源码,还没给出玄机下文,还望不吝赐教 kinsno 发表于 2015-9-18 20:47
代码的任务切换,是靠定时器吗?
从原理上讲,
抢占式,需要时钟中断
非抢占式,不需要。 标记一下! 支持,收藏备用,谢谢楼主分享!{:smile:}{:smile:} PIC中断服务入口函数示例:
//定义中断入口
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt(void)
{
TMR1 = 0x0000;
OSISRExec(TICK_ISR);
IFS0bits.T1IF = 0;//这个一定要
} 这是系统定时器的时钟节拍所需要的 //任务调度
static void OSCtxSw(void)
{
CTcb *ptcb;
CEvent *evt;
CEventList *hdr;
OS_CPU_SR cpu_sr;
//找到优先级最高的任务
ptcb = OSTaskHighPrioQuery();
while (ptcb)
{
//变量保护
OS_ENTER_CRITICAL(cpu_sr);
TCBCur = ptcb;
//退出保护
OS_EXIT_CRITICAL(cpu_sr);
//每次每个任务只处理1个事件
hdr = ptcb->EventList;
if (hdr)
{
evt = hdr->Event;
if (ptcb->pfnEventProcessor)
{
ptcb->pfnEventProcessor(ptcb->TaskId, evt->EventType, evt->EventOpt);
}
//事件队列中删除
OSEventDelete(evt);
}
//清看门狗
CLR_WDT();
ptcb = ptcb->Next;
}
} //内核调度
void OSSched(void)
{
while(1)
{
//系统底层扫描
if (pfnSysHandler)
{
pfnSysHandler();
}
//清看门狗
CLR_WDT();
//应用硬件扫描
if (pfnPollHandler)
{
pfnPollHandler();
}
//任务切换
OSCtxSw();
//清看门狗
CLR_WDT();
}
} 就算用不到也来学习学习OS 下来看看,学习一下 security 发表于 2015-9-21 09:31
我记得你的这个帖子空闲任务源码,还没给出玄机下文,还望不吝赐教 ...
其实也没什么。空闲任务只做++运算,这样可以统计系统的cpu使用率。关键是这个++的变量是个局部变量,外界是不能直接访问的。所以这个值只能“偷”出来。 科技猎人 发表于 2015-9-21 15:09
其实也没什么。空闲任务只做++运算,这样可以统计系统的cpu使用率。关键是这个++的变量是个局部变量,外 ...
{:handshake:} 多谢赐教~ int main()
{
OS_CPU_SR cpu_sr;
#if ((MBUS1_EN > 0) || (MBUS2_EN > 0))
CMBusComm param;
#endif
//禁止中断
OS_ENTER_CRITICAL(cpu_sr);
//硬件初始化
HDWInitSetup();
//操作系统初始化
OSInit();
//出厂设置,这个要放在操作系统初始化之后
SysInitialize();
//Modbus
#if (MBUS1_EN > 0)
//从EEPROM中读取
GetSRU1USARTParam(¶m);
MBUS1Init(param.BaudRate, (CMB1Parity)param.CheckBit);
// MBUS1Init(9600, (CMB1Parity)MB1_PAR_NONE);
#endif
#if (MBUS2_EN > 0)
//从EEPROM中读取
GetSRU2USARTParam(¶m);
MBUS2Init(param.BaudRate, (CMB2Parity)param.CheckBit);
// MBUS2Init(9600, (CMB2Parity)MB2_PAR_NONE);
#endif
#if (MBUS1_EN > 0)
SRU1Initial();
#endif
#if (MBUS2_EN > 0)
SRU2Initial();
#endif
GUIInitial();
#if (EXT_AIO_EN > 0)
ADCPInit();
#endif
//注册底层驱动
OSScanHardwareCB(HardWareScanTask);
//中断服务子程序管理创建
#if (MBUS1_EN > 0)
OSISRCreate(MB1TMR_ISR, (pISRHandler)MBUS1TmrT35Expired);
OSISRCreate(MB1RX_ISR, (pISRHandler)MBUS1PutRxBuffer);
#endif
#if (MBUS2_EN > 0)
OSISRCreate(MB2TMR_ISR, (pISRHandler)MBUS2TmrT35Expired);
OSISRCreate(MB2RX_ISR, (pISRHandler)MBUS2PutRxBuffer);
#endif
#if (MBUS1_EN > 0)
OSTaskCreate(SRU1ExecTask, SRU1_EXEC_TASK_ID, 2);
#endif
#if (MBUS2_EN > 0)
OSTaskCreate(SRU2ExecTask, SRU2_EXEC_TASK_ID, 3);
#endif
OSTaskCreate(GUIExecTask, GUI_EXEC_TASK_ID, 6);
//中断允许
OS_EXIT_CRITICAL(cpu_sr);
//运行
OSSched();
} 如果是自己写的,真的是高人
页:
[1]
2