搜索
bottom↓
回复: 27

精简CONTIKI3.0源码。仅仅保留了多任务和定时器事件

  [复制链接]

出0入0汤圆

发表于 2018-9-7 22:22:12 | 显示全部楼层 |阅读模式
本帖最后由 bg6agf 于 2018-9-8 00:46 编辑




优点:
没有硬件相关的任务切换汇编代码。纯C 完成。也就是说。移植起来非常方便,你也可以理解成。不需要移植
极省内存。内存很小的单片机也能用。据说逻辑上更明确。复杂的任务反而省FLASH空间

缺点(也可以说编程需要注意的要点)
任务主体中 不能用SWITCH。子程序里可用。
任务中的变量如果经历了任务切换的部分会重初始化。所以。如果任务一个变量需要任务切换也不变。就需要static修饰.
所有的任务必须非锁死。必须有任务切换的指令。不能有占用CPU的的长延时。因为这个非抢占式,阻塞长延时影响CPU效率和任务切换响应时间。




这是协作式我任务。我就不多解释了
protothreads 架构的多任务。增加了事件消息
本来用于物联网。协议什么的
我把一些用不着的文件都删除了。只保留多任务和事件驱动
代码量很小基本上是个CPU就能用了。

ETIMER定时器需要一个定时启动的中断产生时基。不需要定时器的话也可以不用。
不需要额外的汇编或者C 代码移植
如果需要定时器。就增加一个定时中断。在中断时给ETIME任务发一个事件消息驱动计时就OK了。

具体CONTIKI的多任务机制在网上有笔记。我就不多说了.网上说的很不错。我只是把这个物联网常用的系统中的多任务部分拿出来当RTOS用。。。

#include "sys/process.h"
#include "sys/clock.h"
#include "sys/etimer.h"


主程序
main 循环里开启多任务


    PROCESS_NAME(etimer_process);
    PROCESS_NAME(precess1);

    process_init();


    process_start(&etimer_process,NULL);//启动系统进程最先启动etimer
    process_start(&precess1,NULL);//启动系统进程最先启动etimer

    while(1)
    {
        while(process_list)
        {
            do
            {

            }
            while(process_run()>0);
        }
    }


另外任务的样子


PROCESS(precess1,"precess1");
PROCESS_THREAD(precess1,ev,data)
{

    PROCESS_BEGIN();
          while(1)
                {
                  
                        PROCESS_YIELD();
                       
                       
                }
            PROCESS_END();
}

example里有一个基本任务的样子。
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello world process");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();

  printf("Hello, world\n");
  
  PROCESS_END();
}

借用别人的文字解释这种OS的特点

以uc/os-ii为代表的RTOS对于任务阻塞(一般使用等待:信号量、邮箱、消息队列等)是很轻松的,这种基于“上下文切换”(Context Switch)的系统,可以在任务调用的任意函数语句中“挂起自己”
 
而Contiki进程可以调用protothread实现“函数级阻塞”


①当protothread等待事件时,它先向process调用PT_YIELD()“挂起函数”;process收到protothread的PT_YIELDED返回值时,执行PROCESS_YIELD()“挂起进程”,向ContikiOS让出系统控制权。

②当外部事件(一般为中断)向ContikiOS发消息时,ContikiOS先调度对应的process,process则继续调用protothread,protothread再处理该事件。

③当protothread处理完所有逻辑后,它向process返回PT_ENDED,此时process知道该protothread已经完成工作。

通过这种“函数级阻塞”技术,可以将逻辑复杂的进程分解成多个protothread,采用分而冶之的办法,让程序设计和维护代价大大降低。

Contiki系统调度和阻塞实质是“函数返回”,因此进程设计有3条原则:

①    每个进程响应一个硬件的poll消息;

②    多个硬件之间的时序交给ISR用状态机完成;

③     进程主体函数尽可能简单,如果复杂将拆分成多个protothread。




本帖子中包含更多资源

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

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-9-7 22:38:37 | 显示全部楼层
这个早就有了,坛子里,N年前就有了。。。

出0入0汤圆

 楼主| 发表于 2018-9-7 23:28:19 | 显示全部楼层
kinsno 发表于 2018-9-7 22:38
这个早就有了,坛子里,N年前就有了。。。

我是把官方的3.0源码精简了。。。自己用。

出0入0汤圆

发表于 2018-9-7 23:45:43 来自手机 | 显示全部楼层
我也做过同样工作,适合8位机和物联网

出0入90汤圆

发表于 2018-9-8 00:23:29 | 显示全部楼层
这个玩意和freertos,ucos有啥去呗?

出0入0汤圆

 楼主| 发表于 2018-9-8 00:24:44 | 显示全部楼层
honami520 发表于 2018-9-8 00:23
这个玩意和freertos,ucos有啥去呗?


没有硬件相关的任务切换汇编代码。纯C 完成。也就是说。移植起来非常方便

你也可以理解成。不需要移植

出0入0汤圆

发表于 2018-9-8 04:25:30 | 显示全部楼层
一直用状态机裸奔,8位机32位机移植也很方便。

出0入0汤圆

发表于 2018-9-10 12:54:10 | 显示全部楼层
https://github.com/EDI-Systems/M2A1_MuSimpron
这个基本上不能再精简了。。。

出0入0汤圆

 楼主| 发表于 2018-9-10 13:47:45 | 显示全部楼层
pryprypry 发表于 2018-9-10 12:54
https://github.com/EDI-Systems/M2A1_MuSimpron
这个基本上不能再精简了。。。

从使用上来说。这个更接近一个。RTOS。每个任务都是正常的流程。同时。任务的启动和停止。也都有。。消息传递也有。更接近RTOS的方法。理解上容易很多。

出0入0汤圆

发表于 2018-9-10 15:36:54 来自手机 | 显示全部楼层
如果系统已经很简单的话,信息传递可能都是多余的了。。。

出0入0汤圆

发表于 2018-9-10 15:37:15 来自手机 | 显示全部楼层
直接用全局变量就好了。反正变量也是不多的。

出0入0汤圆

发表于 2018-9-10 15:39:50 来自手机 | 显示全部楼层
而且我这个还支持由硬件确定的任务优先级,可以变相实现抢占

出0入0汤圆

发表于 2018-9-10 15:39:50 来自手机 | 显示全部楼层
而且我这个还支持由硬件确定的任务优先级,可以变相实现抢占

出0入0汤圆

发表于 2018-9-10 16:50:16 | 显示全部楼层
标记下,顶一个

出0入0汤圆

发表于 2018-9-11 08:26:57 | 显示全部楼层
谢谢分享。。。。。

出870入263汤圆

发表于 2018-9-15 19:56:20 | 显示全部楼层
honami520 发表于 2018-9-8 00:23
这个玩意和freertos,ucos有啥去呗?


跟freertos的croutine一样(freertos绝大多数的用法不是协作式,而是和ucos一样);跟ucos这样的完全不一样,ucos每个线程有独立的栈,可以自由切换而无需担心现场破坏;
而协作式是伪造的“多线程”,其实是switch实现的状态机而已,使用中注意点非常多!我曾经用过,很容易出bug。跟freertos,ucos,rt-thread,rtx不是一个级别的东西。
去下载uip网络协议栈,里面就有一个精简的protothread。

出0入0汤圆

发表于 2018-9-18 23:47:31 来自手机 | 显示全部楼层
还是不错的 编程注意点多 确实是

出0入0汤圆

 楼主| 发表于 2018-9-19 00:04:19 来自手机 | 显示全部楼层
armstrong 发表于 2018-9-15 19:56
跟freertos的croutine一样(freertos绝大多数的用法不是协作式,而是和ucos一样);跟ucos这样的完全不一 ...

学会了怎么用不会有问题…恰恰这种纯C结构比硬件相关的结构更可靠…比不用操作系统高级…比操作系统低级…但是占用少很多…绝大多数场合实用合适…还有一个好处…可以用于arduino的多任务

出0入0汤圆

发表于 2019-6-13 23:18:25 | 显示全部楼层
这个系统不错!~~

出0入0汤圆

发表于 2019-11-25 08:51:51 | 显示全部楼层
下载玩下

出0入0汤圆

发表于 2019-11-26 19:35:40 | 显示全部楼层
不能用SWITCH~~

出0入0汤圆

发表于 2019-11-26 22:51:06 来自手机 | 显示全部楼层
一直用protothread,很好用

出20入118汤圆

发表于 2019-11-27 06:31:27 来自手机 | 显示全部楼层
mark下,实验下

出0入0汤圆

发表于 2019-12-12 23:27:42 | 显示全部楼层
Mark,实验理解一下

出0入0汤圆

 楼主| 发表于 2019-12-13 09:22:11 | 显示全部楼层


不能在任务体里直接用。但是你弄个函数调用一下就行了。实际上大多时候用 if else 更好。

出0入0汤圆

发表于 2019-12-31 16:09:46 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2020-1-1 19:11:11 来自手机 | 显示全部楼层
按照目前的mcu发展 PT类似的东西很快边缘化。上个成熟的rtos很方便,何必折腾

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-24 01:48

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

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