【LPC54100】在M0上跑事件驱动构架(一)

@20150216

初次接触非对称双核MCU,由于之前好多知识不熟悉,这三天遇到不少问题。现在终于把事件驱动在M0核上跑起来了,就发一贴简单介绍下这个事件驱动构架和这几天的5410x芯片学习所得。
关于事件驱动架构,其主要用于低功耗设计,可以很方便的进入休眠模式。一般单片机裸奔都是轮询,如:

  1. void main()

  2. {
  3. while(1)
  4. {
  5. tesk1();
  6. tesk2();
  7. tesk3();
  8. }
  9. }

复制代码

在这种轮询处理中,很难判断在何时休眠,该休眠多长时间,又该使用什么等级的休眠。

而事件驱动的main函数如下(以VSF为例):

  1. while (1)

  2. {
  3. vsfsm_poll();
  4. vsf_enter_critical();

  5. if (!vsfsm_get_event_pending())
  6. {
  7. vsf_leave_critical();
  8. __WFI();
  9. }
  10. else
  11. {
  12. vsf_leave_critical();
  13. }
  14. }

复制代码

VSF在程序中增加了一个事件队列,当这个事件队列为空时,即进行休眠。休眠时间由程序所配置的唤醒定时器决定,当然一些外部硬件中断也可以唤醒。如果需要使用不同的休眠等级,那也需要做一个休眠等级管理器,不同线程要求不同的休眠等级,然后由管理器决定休眠等级。当然这些细化配置会比较麻烦…

其实,事件驱动能干的,在RTOS中都能干,很多事情RTOS可以干的更好,更舒服。但是,事件驱动有一个最大的优点:省RAM,在很多低功耗MCU中,RAM一般比较小,RTOS虽然都能裁剪,但是每个任务所分配的堆栈不能裁剪,当任务一多,ram分配也挺烦心。而事件驱动归根到底还是裸奔,只是将线程(一个函数指针加一个事件状态)放在队列中进行管理,逐个调用而已。每个线程只花费十几个字节RAM。

这次所用的是Simon的事件驱动VSF平台,代码是放在github上的,github.com/versaloon/vsf,21ic也有一些介绍帖,有兴趣自己去看。
下面把示例代码献丑一下,非常非常粗糙的,帖子里的代码额外增加了中文说明

  1. // 线程1

  2. // 定义一个事件状态
  3. #define EVENT_1_USER_LOCAL_SCANF                (VSFSM_EVT_USER_LOCAL + 1)
  4. static struct vsfsm_state_t *
  5. event_1_handler(struct vsfsm_t *sm, vsfsm_evt_t evt);
  6. struct vsfsm_t event_1_sm =
  7. {
  8. {event_1_handler}, // 初始化handler
  9. };
  10. // 用于产生间隔为5秒的周期事件定时器
  11. static struct vsftimer_timer_t event_1_timer =
  12. {
  13. 5000,        // 间隔为5秒
  14. &event_1_sm,        // 对应状态机
  15. EVENT_1_USER_LOCAL_SCANF, // 周期事件
  16. };
  17. struct vsfsm_state_t *

  18. event_1_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
  19. {
  20. switch (evt)
  21. {
  22. case VSFSM_EVT_INIT: // 初始化事件时,被默认执行
  23. vsftimer_register(&event_1_timer);
  24. break;
  25. case EVENT_1_USER_LOCAL_SCANF: // 周期事件处理
  26. Board_UARTPutSTR(“event 1rn”); // 打印出“event 1”
  27. print_tick();                                        // 打印出当前系统tick
  28. break;
  29. default:
  30. break;
  31. }
  32. return NULL;

  33. }
  34. // 线程2,将线程间隔改为3秒

  35. #define EVENT_2_USER_LOCAL_SCANF                (VSFSM_EVT_USER_LOCAL + 1)
  36. static struct vsfsm_state_t *
  37. event_2_handler(struct vsfsm_t *sm, vsfsm_evt_t evt);
  38. struct vsfsm_t event_2_sm =
  39. {
  40. {event_2_handler},
  41. };
  42. static struct vsftimer_timer_t event_2_timer =
  43. {
  44. 3000,
  45. &event_2_sm,
  46. EVENT_2_USER_LOCAL_SCANF,
  47. };
  48. struct vsfsm_state_t *

  49. event_2_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
  50. {
  51. switch (evt)
  52. {
  53. case VSFSM_EVT_INIT:
  54. vsftimer_register(&event_2_timer);
  55. break;
  56. case EVENT_2_USER_LOCAL_SCANF:
  57. Board_UARTPutSTR(“event 2rn”);
  58. print_tick();
  59. break;
  60. default:
  61. break;
  62. }
  63. return NULL;

  64. }
  65. int main(void)

  66. {
  67. // 串口初始化
  68. board_uart_init();
  69. // 使用utick中断唤醒
  70. board_utick_init();
  71. vsftimer_init();

  72. Board_UARTPutSTR(“START!rn”);

  73. vsfsm_init(&event_1_sm);

  74. vsfsm_init(&event_2_sm);
  75. vsf_leave_critical();

  76. while (1)
  77. {
  78. vsfsm_poll(); // 轮询状态机
  79. vsf_enter_critical();

  80. if (!vsfsm_get_event_pending()) // 判断是否有未处理事件
  81. {
  82. vsf_leave_critical();
  83. __WFI();
  84. }
  85. else
  86. {
  87. vsf_leave_critical();
  88. }
  89. }
  90. }

复制代码

串口输出:

PS: 现在的vsftimer并没有做休眠时间的动态管理,而是简单粗暴的定时唤醒一次,看看有没有事件需要处理。这个功能我会在后面完善。
Simon的架构中还有很多好玩的东西,有兴趣可以去研究下。

时间: 2024-08-05 14:07:57

【LPC54100】在M0上跑事件驱动构架(一)的相关文章

让python在hadoop上跑起来

duang~好久没有更新博客啦,原因很简单,实习啦-好吧,我过来这边上班表示觉得自己简直弱爆了.第一周,配置环境:第二周,将数据可视化,包括学习了excel2013的一些高大上的技能,例如数据透视表和mappower绘制3d地图,当然本来打算是在tkinter里面运用matplotlib制作一个交互式的图表界面,然而,画出来的图简直不是excel2013能比的,由于对界面和matplotlib研究的也不是很深,短时间是没法研究出来,上周真是多灾多难:现在,第三周,开始接触hadoop,虽说大多数

ubuntu上跑python连接pg,报错 ImportError: No module named psycopg2

ubuntu上跑python连接pg,报错  ImportError: No module named psycopg2 [email protected]:~# python /home/zxw/PGWriterTest_m.py Traceback (most recent call last): File "/home/zxw/PGWriterTest_m.py", line 4, in <module> import psycopg2 ImportError: No

我写的界面,在ARM上跑

这个...其实,我对ARM了解并不多,我顶多也就算是知道ARM怎么玩,EMMC干啥,MMU干啥,还有早期的叫法,比如那个NorFlash NandFlash ,然后也就没啥了. 然后写个裸机什么的,那个还稍微好一点点... 还是那个界面,运行环境,Contex-A9. boot使用的是 uboot ,然后 dnw 把界面下载到板子里,直接写的显存,方法简单有效.通用. 目前,就这个在ARM上跑的问题,就是,如何才能简单.有效且通用的实现鼠标键盘的操作抓取,x86上,好办,无非就是接管几个中断,基

树莓PI上跑爬虫

主要是进行主机上使用myeclipse开发后,在从机上跑最后的程序 在主机上和树莓上都安装好java环境,maven,ant 拷到RPI上的时候修改 为 拷贝到RPI上的目录结构 mvn compile ant -f  spy1\build.xml  clean build App

如何在cluster上跑R脚本

R 是一个比较不错但是有时候操蛋的语言,不错是因为用着爽的时候真的很爽,操蛋是因为这种爽不是什么时候都可以的,比如说在cluster上批处理跑R脚本. 当然说这话有些在上面跑过的各种不服气,你丫傻逼吧这么简单都不会,呵呵,别急,我今天就是来看看怎么在cluster上提交R脚本的. R有几种命令行处理模式,典型的是 R COMMAND BATCH "--args arg1 arg2.." *.r *.out R --vanilla --args arg1 arg2 ... <*.r

在deepin上跑BOINC的一点经验总结

BOINC(Berkeley Open Infrastructure for NetworkComputing,伯克利开放式网络计算平台)是目前主流的分布式计算平台之一,旨在为各研究者提供汇集全球各地大量个人电脑的强大运算能力.直至2008年1月25日,BOINC在全世界有约549,000台活跃的主机并平均提供约852TeraFLOPS (TFLOPS)的运算能力.对志愿者来说,它提供了一个统一的客户端程序. 我以前都是在windows系统下跑boinc的,现在使用deepin linux系统了

26、android上跑apache的ftp服务

一.为啥 在android设备跑ftp服务,在现场方便查看日志,目前就是这么用的. 二.前提: 从apache的官网下载依赖包:http://mina.apache.org/ftpserver-project/download_1.0.6.html 解压后如下: 在最右侧的jar包列表中,并不需要全部导入我们的工程,需要导入的包为: 记得把jar包添加到buildPath,同时在order and export选项选中上步添加的jar包 三.如何用: 1 package com.example.

【新手出发】从搭虚拟机开始,一步一步在CentOS上跑起来.Net Core程序

文章背景 微软6月26号发布core 1.0版本后,园子里关于这方面的文章就更加火爆了,不管是从文章数量还是大家互动的热情来看,绝对是最热门的技术NO.1.我从去年底开始接触.net core到现在也大半年了,一直停留在浏览各种帖子上,偶尔新建个项目敲几行代码练习一下.可是对于core最大的卖点——跨平台,一直没法实际体验一回,因为压根没接触过Linux,完全不会那些命令,甚至虚拟机都没玩过?,想在Linux上实战操作一下可想有多困难.虽然园子里很多文章都有教程,但大神们一开始直接就上各种命令代

在eclipse上跑hadoop的helloworld

关于hadoop的用处什么我就不说了,在这里记录下在eclipse上第一次跑hadoop遇到的问题吧~ hadoop的安装我就不说啦,网上教程一大堆~我直接用的公司的Linux上的hadoop. eclipse用的是mars,JDK1.8,win7,hadoop是公司的Linux上的hadoop 1.2.1,关联的JDK是1.7. 首先下载hadoop关联eclipse的插件hadoop-eclipse-plugin-1.2.1.最好下载相同版本的,不然容易出问题(我就是典型).把插件放到ecl