搜索
bottom↓
回复: 137

自己写的非抢占式嵌入式操作系统ATOS,全c语言,移植太...

  [复制链接]

出0入0汤圆

发表于 2015-9-18 11:21:37 | 显示全部楼层 |阅读模式
ATOS是一个非抢占式的嵌入式操作系统平台,采用事件机制驱动设计,任何应用的执行都是靠事件来触发。触发事件可以是外部设备、内部定时器、其它任务发送的邮箱、信号量等事件。系统内核分为底层事件扫描,任务调度管理两部分。底层事件用于扫描外设发生的事件,任务调度管理则实现任务切换、任务处理。任务按照事件触发先后顺序执行。ATOS也是具有优先级之分,优先级高的任务先运行。任务调度由调度周期来实现,在1个调度周期内,由事件发生的任务按照优先级高低依次运行。每个周期内,任务都有运行的机会,且每个任务只处理1个事件。
ATOS完全是由c语言实现,移植方便,无需考虑不同硬件间复杂配置。ATOS具有丰富的开发模块库,为开发者提供方便,快捷、简单、稳定、可靠的嵌入式应用程序开发平台。
ATOS主要分为内核模块和基本外围模块两部分,内核模块是实现系统切换调度,为应用提供支撑的必不可少部分。外围模块则是为应用提供更为复杂应用的配置,方便用户使用。
ATOS内核可分为任务管理、事件管理、任务调度、邮箱管理、信号量管理、定时器管理、动态内存、中断管理等功能。
系统基本外围模块库包含IO扫描,LED闪烁,键盘扫描,存储支持,数据库等模块。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入4汤圆

发表于 2015-9-18 11:28:04 | 显示全部楼层
支持楼主,下次写代码就用楼主的OS,但关键是,代码呢?

出0入0汤圆

 楼主| 发表于 2015-9-18 11:30:47 | 显示全部楼层
分享操作系统源码哦,QQ;29130683

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入70汤圆

发表于 2015-9-18 11:36:46 | 显示全部楼层
标记一下!   

出0入0汤圆

发表于 2015-9-18 12:24:00 | 显示全部楼层
普通的51单片机也可以用?

出200入0汤圆

发表于 2015-9-18 12:29:54 来自手机 | 显示全部楼层
支持,收藏备用

出0入0汤圆

发表于 2015-9-18 12:31:27 来自手机 | 显示全部楼层
牛叉!等使用报告!如果好用!我也试试!谢谢

出0入0汤圆

 楼主| 发表于 2015-9-18 12:36:24 | 显示全部楼层
已经在很多项目中使用了。

出0入0汤圆

 楼主| 发表于 2015-9-18 12:40:10 | 显示全部楼层
当初写这个的目的就是为了偷懒,移植,复用。传统的抢占式rtos,都需要汇编来操作程序指针,堆栈指针,压栈,出栈,不同的CPU,编译环境,汇编代码还不一样,并且容易出错,由于普通的应用对实时性没有想象到的那么苛刻,就写了该系统。移植非常方便,该系统借鉴了ucOS,freeRTOS, OSCAL等不同操作系统的理念。

出0入0汤圆

发表于 2015-9-18 12:49:42 | 显示全部楼层
支持,收藏备用,谢谢楼主分享!

出0入0汤圆

发表于 2015-9-18 12:58:23 | 显示全部楼层
谢谢分享,收藏

出0入0汤圆

发表于 2015-9-18 13:05:11 | 显示全部楼层
谢谢。。。受教了

出0入93汤圆

发表于 2015-9-18 13:05:25 | 显示全部楼层
收藏备用

出0入0汤圆

发表于 2015-9-18 13:15:00 来自手机 | 显示全部楼层
屌炸天了。

出0入0汤圆

发表于 2015-9-18 13:19:18 来自手机 | 显示全部楼层
屌炸天了。

出0入0汤圆

发表于 2015-9-18 13:20:11 来自手机 | 显示全部楼层
谢谢楼主分享,回去使用下。移植方便是最好不过的了

出0入0汤圆

 楼主| 发表于 2015-9-18 13:29:53 | 显示全部楼层
在PIC24F,PIC18F,STM32,FreeScale单片机上用过,产品停车场车位引导,温控器联网,户用多功能热量表,数据采集器,控制器,以太网网关,闸门检测控制器。

出0入0汤圆

发表于 2015-9-18 13:32:58 | 显示全部楼层
全C的,收藏了。

出0入0汤圆

 楼主| 发表于 2015-9-18 13:38:05 | 显示全部楼层
http://www.amobbs.com/forum.php? ... 476&pid=8774090,控制器就是用这个系统做的

出0入0汤圆

发表于 2015-9-18 13:43:50 | 显示全部楼层
mark

出0入8汤圆

发表于 2015-9-18 13:45:35 | 显示全部楼层
占用多少flash和RAM

出0入0汤圆

 楼主| 发表于 2015-9-18 13:47:19 | 显示全部楼层
最少1K RAM, 4K FLASH。模块功能可裁剪

出0入0汤圆

 楼主| 发表于 2015-9-18 13:51:42 | 显示全部楼层
大家可以参考这个标题,控制器就是用这个系统做的。http://www.amobbs.com/forum.php? ... 476&pid=8774090

出0入0汤圆

发表于 2015-9-18 14:19:24 | 显示全部楼层
楼主可上传一个STM32的MDK工程?一个任务LED闪烁,一个任务串口发送数据

出0入0汤圆

发表于 2015-9-18 15:06:40 | 显示全部楼层
最好能上传一个例子程序,这样学习起来快一些,简单的例子,包含你的所有功能就可以

出0入0汤圆

发表于 2015-9-18 15:25:12 | 显示全部楼层
tabc_123 发表于 2015-9-18 15:06
最好能上传一个例子程序,这样学习起来快一些,简单的例子,包含你的所有功能就可以 ...

赞同
                 

出20入12汤圆

发表于 2015-9-18 15:25:14 | 显示全部楼层
发现I2C_WriteArray,I2C_ReadArray没有跨页处理

出0入0汤圆

 楼主| 发表于 2015-9-18 15:28:01 | 显示全部楼层
在上层中自己分页

出0入0汤圆

发表于 2015-9-18 15:30:09 | 显示全部楼层
赞同赞同

出20入12汤圆

发表于 2015-9-18 15:34:22 | 显示全部楼层
看到了,
//存储每页包含字节
#define MAX_NVM_SIZE_PER_PAGE                (64)
呵呵

出0入0汤圆

 楼主| 发表于 2015-9-18 15:35:21 | 显示全部楼层
关于存储的代码函数

出0入8汤圆

发表于 2015-9-18 15:35:57 | 显示全部楼层
谢谢分享, 有空学习学习。

出0入0汤圆

发表于 2015-9-18 15:37:51 | 显示全部楼层
好东西收藏了!

出0入0汤圆

 楼主| 发表于 2015-9-18 15:38:23 | 显示全部楼层
//读取记录表信息
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));
}

出0入0汤圆

发表于 2015-9-18 15:41:37 | 显示全部楼层
收藏了,谢谢分享

出0入0汤圆

发表于 2015-9-18 15:49:15 来自手机 | 显示全部楼层
谢谢楼主 下来试试

出0入0汤圆

发表于 2015-9-18 15:49:54 | 显示全部楼层
这么流弊的东东,自然得顶了。

出0入0汤圆

发表于 2015-9-18 15:57:38 | 显示全部楼层
顶一个,楼主大爱。

出0入0汤圆

发表于 2015-9-18 15:59:18 | 显示全部楼层
好东西收藏了!

出0入0汤圆

发表于 2015-9-18 15:59:28 | 显示全部楼层
之前也做过PIC的开发,有点基础,正好看看楼主是怎样写代码的。

出0入0汤圆

发表于 2015-9-18 16:02:58 | 显示全部楼层
收藏了,谢谢分享

出0入0汤圆

发表于 2015-9-18 16:06:28 | 显示全部楼层
收藏了,下来用用

出0入0汤圆

发表于 2015-9-18 16:10:48 | 显示全部楼层
看看代码质量,感觉不错.

出0入0汤圆

发表于 2015-9-18 16:13:20 来自手机 | 显示全部楼层
谢谢楼主 下来试试

出0入0汤圆

发表于 2015-9-18 16:23:32 | 显示全部楼层
牛人!!!!!!!

出0入0汤圆

发表于 2015-9-18 16:25:50 | 显示全部楼层
sdu_amayer 发表于 2015-9-18 11:30
分享操作系统源码哦,QQ;29130683

有例程没??

出0入0汤圆

发表于 2015-9-18 16:31:21 | 显示全部楼层
TI的OSAL,类似

出0入0汤圆

发表于 2015-9-18 16:37:02 | 显示全部楼层
嗯,研究下,有空用用。多谢

出0入0汤圆

发表于 2015-9-18 16:38:48 | 显示全部楼层
不错不错,全C的比较好看

出0入0汤圆

发表于 2015-9-18 16:51:00 | 显示全部楼层
有没有STM32F系列芯片的例程?

出0入0汤圆

发表于 2015-9-18 16:53:06 | 显示全部楼层
牛人!!!!!!!

出0入0汤圆

 楼主| 发表于 2015-9-18 16:56:59 | 显示全部楼层
例程都太大,都是具体应用。根据说明自己写吧,这样理解比较深些。可以附送一个任务函数例程。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-9-18 17:01:19 | 显示全部楼层
最近QQ出现问题了,没法加入好友了,烦死了

出0入0汤圆

发表于 2015-9-18 17:08:19 | 显示全部楼层
嗯,研究下,有空用用。多谢

出0入0汤圆

发表于 2015-9-18 17:15:24 | 显示全部楼层
强人!!!
下载下来学习一下。

出0入0汤圆

 楼主| 发表于 2015-9-18 17:36:08 | 显示全部楼层
最近QQ出现问题了,没法加入好友了,烦死了

出0入0汤圆

发表于 2015-9-18 17:44:25 | 显示全部楼层
谢楼主无私!!!!!!!!!

出0入0汤圆

发表于 2015-9-18 17:53:17 | 显示全部楼层
这个好,一定试试

出0入76汤圆

发表于 2015-9-18 18:30:53 | 显示全部楼层
感谢分享,粗略看了一下, 不错, 楼主的代码很规范
待后续深入拜读, 空了试用一下

出0入0汤圆

发表于 2015-9-18 19:17:37 | 显示全部楼层
收藏学习下

出0入0汤圆

发表于 2015-9-18 19:33:49 来自手机 | 显示全部楼层
顶楼主,有空好好学习下,感谢分享。

出0入4汤圆

发表于 2015-9-18 19:35:46 来自手机 | 显示全部楼层
厉害了学习学习

出0入0汤圆

发表于 2015-9-18 19:46:11 | 显示全部楼层
赞一个,我也在搞os,大家多多交流

出0入0汤圆

发表于 2015-9-18 20:01:33 | 显示全部楼层
好东西收藏了!

出0入0汤圆

发表于 2015-9-18 20:22:13 | 显示全部楼层
好东西先收藏再学习研究.谢谢楼主分享.

出0入0汤圆

发表于 2015-9-18 20:39:34 | 显示全部楼层
感谢楼主无私的奉献,对于小单片机资源,又想上操作系统是非常好不过了,留着备用,不过对于小单片机来说RAM占用就有点偏大了

出0入0汤圆

发表于 2015-9-18 20:47:00 | 显示全部楼层
sdu_amayer 发表于 2015-9-18 17:36
最近QQ出现问题了,没法加入好友了,烦死了

代码的任务切换,是靠定时器吗?

出0入0汤圆

 楼主| 发表于 2015-9-18 22:21:07 | 显示全部楼层
代码的切换实际上就是一个while死循环,执行完一个任务再执行下一个任务,在任务队列中优先级最高的在前面

出0入0汤圆

发表于 2015-9-18 23:58:50 | 显示全部楼层
收藏了,研究支持一下!

出0入0汤圆

发表于 2015-9-19 08:44:53 | 显示全部楼层
收藏了,支持一下!

出0入0汤圆

发表于 2015-9-19 08:50:34 | 显示全部楼层
谢谢楼主, 学习了

出0入0汤圆

 楼主| 发表于 2015-9-19 10:26:25 | 显示全部楼层
请关注,后续会逐渐推出uip协议栈移植及应用

出0入0汤圆

发表于 2015-9-19 17:31:22 来自手机 | 显示全部楼层
谢谢楼主,,,,

出0入0汤圆

发表于 2015-9-19 19:16:48 来自手机 | 显示全部楼层
sdu_amayer 发表于 2015-9-18 11:30
分享操作系统源码哦,QQ;29130683

没有一些具体mcu的demo不利于初学者入门的。大牛也不需要这些。个人建议而已

出0入0汤圆

发表于 2015-9-19 20:14:26 | 显示全部楼层
好东西!mark!!!

出0入0汤圆

发表于 2015-9-20 12:04:15 | 显示全部楼层
操作系统ATOS

出0入0汤圆

发表于 2015-9-20 13:36:59 | 显示全部楼层
希望楼主能提供该程序的STM32工程啊,这样方便我们研究啊

出0入0汤圆

发表于 2015-9-20 13:44:53 | 显示全部楼层
希望楼主能提供该程序的STM32工程啊,这样方便我们研究啊

出0入0汤圆

发表于 2015-9-20 14:01:12 | 显示全部楼层
这个要顶,厉害,下来看看

出100入85汤圆

发表于 2015-9-20 19:22:14 来自手机 | 显示全部楼层
觉得思路不错,提供一个可以运行的例程,简单的串口,LED就行,这样大家上手也快。

出0入0汤圆

发表于 2015-9-20 19:23:10 | 显示全部楼层
谢谢分享,下载了研究下,等有机会也使用下试试

出0入0汤圆

发表于 2015-9-20 22:33:14 | 显示全部楼层
自然得顶了。

出0入0汤圆

发表于 2015-9-20 22:45:05 | 显示全部楼层
支持。。。赞一个

出0入8汤圆

发表于 2015-9-20 22:54:44 | 显示全部楼层
非常好的系统例程,学学,

出0入8汤圆

发表于 2015-9-20 22:55:39 | 显示全部楼层
非常好的系统例程,学学,为什么每次都要发二次才能发出去啊,

出100入0汤圆

发表于 2015-9-20 23:08:46 来自手机 | 显示全部楼层
收藏,向楼主学习!

出0入8汤圆

发表于 2015-9-21 09:31:51 | 显示全部楼层
科技猎人 发表于 2015-9-18 19:46
赞一个,我也在搞os,大家多多交流

我记得你的这个帖子[MsgOS]空闲任务源码,还没给出玄机下文,还望不吝赐教

出0入8汤圆

发表于 2015-9-21 09:47:00 | 显示全部楼层
kinsno 发表于 2015-9-18 20:47
代码的任务切换,是靠定时器吗?

从原理上讲,
抢占式,需要时钟中断
非抢占式,不需要。

出0入0汤圆

发表于 2015-9-21 10:16:27 | 显示全部楼层
标记一下!            

出0入0汤圆

发表于 2015-9-21 10:35:04 | 显示全部楼层
支持,收藏备用,谢谢楼主分享!

出0入0汤圆

 楼主| 发表于 2015-9-21 10:55:30 | 显示全部楼层
PIC中断服务入口函数示例:
//定义中断入口
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt(void)
{
        TMR1 = 0x0000;
        OSISRExec(TICK_ISR);

        IFS0bits.T1IF = 0;//这个一定要
}

出0入0汤圆

 楼主| 发表于 2015-9-21 10:58:40 | 显示全部楼层
这是系统定时器的时钟节拍所需要的

出0入0汤圆

 楼主| 发表于 2015-9-21 11:21:23 | 显示全部楼层
//任务调度
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;
        }
}

出0入0汤圆

 楼主| 发表于 2015-9-21 11:21:55 | 显示全部楼层
//内核调度
void OSSched(void)
{
        while(1)
        {
                //系统底层扫描
                if (pfnSysHandler)
                {
                        pfnSysHandler();
                }

                //清看门狗
                CLR_WDT();

                //应用硬件扫描
                if (pfnPollHandler)
                {
                        pfnPollHandler();
                }

                //任务切换
                OSCtxSw();       

                //清看门狗
                CLR_WDT();
        }
}

出0入0汤圆

发表于 2015-9-21 11:36:59 | 显示全部楼层
就算用不到也来学习学习OS

出0入0汤圆

发表于 2015-9-21 14:17:43 | 显示全部楼层
下来看看,学习一下

出0入0汤圆

发表于 2015-9-21 15:09:04 | 显示全部楼层
security 发表于 2015-9-21 09:31
我记得你的这个帖子[MsgOS]空闲任务源码,还没给出玄机下文,还望不吝赐教 ...

其实也没什么。空闲任务只做++运算,这样可以统计系统的cpu使用率。关键是这个++的变量是个局部变量,外界是不能直接访问的。所以这个值只能“偷”出来。

出0入8汤圆

发表于 2015-9-21 15:35:51 | 显示全部楼层
科技猎人 发表于 2015-9-21 15:09
其实也没什么。空闲任务只做++运算,这样可以统计系统的cpu使用率。关键是这个++的变量是个局部变量,外 ...

多谢赐教~

出0入0汤圆

 楼主| 发表于 2015-9-21 16:27:27 | 显示全部楼层
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(&param);
        MBUS1Init(param.BaudRate, (CMB1Parity)param.CheckBit);
//        MBUS1Init(9600, (CMB1Parity)MB1_PAR_NONE);
        #endif

        #if (MBUS2_EN > 0)

        //从EEPROM中读取
        GetSRU2USARTParam(&param);
        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();
}

出0入0汤圆

发表于 2015-9-21 16:53:37 | 显示全部楼层
如果是自己写的,真的是高人
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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