[新手园地] 发个帖子出去放风筝

[复制链接]
 楼主| dong_abc 发表于 2011-5-2 13:14 | 显示全部楼层 |阅读模式
本帖最后由 dong_abc 于 2011-5-2 22:15 编辑

发现很多宅男宅女,出去活动活动吧。

整理了一下代码,发个M0裸奔的小系统,文件有点多,来个主文件和系统节拍文件


  1. /*******************************************************************
  2. main.c file
  3. 作者:dong_abc
  4. 建立日期: 2011.05.01(2011年劳动节)
  5. 修改日期:
  6. 版本:V1.0
  7. 版权自由,欢迎盗版
  8. Copyright(C) Anybody of Nuvoton MCU lover
  9. All rights reserved            
  10. ********************************************************************/
  11. #include "main.h"
  12. /********************************************************************
  13. 函数功能:系统初始化。
  14. 入口参数:无。
  15. 返    回:无。
  16. 备    注:无。
  17. ********************************************************************/
  18. void Sys_Init(void)
  19. {
  20. UNLOCKREG();              // 芯片注册解锁
  21.   SYSCLK->WRCON.XTL12M_EN = 1;    // 设定12M外部晶振
  22. DrvSYS_Delay(5000);         // 等待时钟就绪
  23. SysTick_Init();           // 系统节拍及中断初始化配置
  24. Timer0_Init();           // 定时器初始化配置
  25. Uart_Init();            // 串口初始化配置
  26. ADC_Init();             // ADC初始化配置
  27. Seg7_Init();            // 数码管初始化配置
  28. Key_Init();             // 按键初始化配置
  29. }
  30. /********************************************************************
  31. 函数功能:20ms弱实时回调处理函数。
  32. 入口参数:无。
  33. 返    回:无。
  34. 备    注:盗版农民讲习所的《建立MCU通用处理程序》。
  35.      本来要做成芯唐库里类似的回调函数,那种固定模式非常好,只是
  36.      n个名字类似的指针变量和函数实在让人晕
  37. ********************************************************************/
  38. void Weekness_20msCallback(void)
  39. {
  40. Key_Proc();
  41. }
  42. /********************************************************************
  43. 函数功能:5ms弱实时回调处理函数。
  44. 入口参数:无。
  45. 返    回:无。
  46. 备    注:盗版农民讲习所的《建立MCU通用处理程序》。
  47. ********************************************************************/
  48. void Weekness_5msCallback(void)
  49. {
  50. Seg7_Fresh();
  51. }
  52. /********************************************************************
  53. 函数功能:系统主函数。
  54. 入口参数:无。
  55. 返    回:无。
  56. 备    注:无。
  57. ********************************************************************/
  58. int main (void)
  59. {
  60.                               
  61. Sys_Init();
  62. SysTimer_WeeknessRegister( Weekness_20msCallback, Weekness_5msCallback );
  63.   
  64. while(1)
  65. {
  66.   
  67. }
  68. }



  69. //SysTick.c  file

  70. #include "SysTick.h"
  71. //系统系统节拍计数器变量及弱实时任务函数指针
  72. struct InSysTimer {      
  73. void ( *Weekness_20ms )();       //20ms弱实时任务函数指针
  74. void ( *Weekness_5ms )();        //5ms弱实时任务函数指针
  75.   uint32_t SysTickCnt;             //系统节拍计数器
  76. };
  77. struct InSysTimer sInSysTimer;
  78. /********************************************************************
  79. 函数功能:系统节拍及中断初始化配置。
  80. 入口参数:无。
  81. 返    回:无。
  82. 备    注:无。
  83. ********************************************************************/
  84. void SysTick_Init(void)
  85. {
  86. SysTick_Config(12000000/(100*2));        //5ms系统节拍中断
  87. }

  88. /********************************************************************
  89. 函数功能:系统节拍中断函数。
  90. 入口参数:无。
  91. 返    回:无。
  92. 备    注:无。
  93. ********************************************************************/
  94. void SysTick_Handler(void)
  95. {
  96. sInSysTimer.SysTickCnt++;
  97. //500ms时钟节拍
  98. if(sInSysTimer.SysTickCnt%100==0)  
  99. {
  100.   //系统运行指示灯
  101.   //outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->PIN) ^ (1 << 5));  
  102.   outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->PIN) ^ 0x007c);
  103.   sInSysTimer.SysTickCnt=0;
  104. }   
  105. //20ms弱实时任务函数
  106. if(sInSysTimer.SysTickCnt%4==0)
  107. {      
  108.   if(sInSysTimer.Weekness_20ms) (*sInSysTimer.Weekness_20ms)();
  109. }
  110.   
  111. //10ms弱实时任务
  112. if(sInSysTimer.SysTickCnt%2==0)
  113. {     
  114.    
  115. }
  116. //5ms弱实时任务函数
  117. if(sInSysTimer.Weekness_5ms) (*sInSysTimer.Weekness_5ms)();
  118. }
  119. /********************************************************************
  120. 函数功能:注册弱实时任务处理函数。
  121. 入口参数:无。
  122. 返    回:无。
  123. 备    注:无。
  124. ********************************************************************/
  125. void SysTimer_WeeknessRegister( void(*Function_20ms)(), void(*Function_5ms)() )
  126. {
  127. sInSysTimer.Weekness_20ms = Function_20ms;
  128. sInSysTimer.Weekness_5ms  = Function_5ms;
  129. }



本帖子中包含更多资源

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

×
john_lee 发表于 2011-5-3 16:44 | 显示全部楼层
不要光看到Protothread的优点,它的局限性也很明显,下面摘录一段:

虽然Protothreads具有占用资源少、方便多任务处理等优点,但由于其本质上仅仅是对一些C程序的封装,并不是真正的线程。所以与真正的操作系统线程相比,Protothreads线程具有一些局限性:
    (1)Protothreads线程不具备各自的堆栈,而是采用所有线程共享主程序的堆栈的方式。这虽然能够极大地减少硬件资源的消耗,但也使得每个Protothreads线程无法保存各自的局部变量,而必须通过静态变量来保存必要的数据。
    (2)Protothreads虽然提供了在各自线程内的条件阻塞机制,但对于在该线程内调用的其它函数,则无法阻塞其运行。所以,如果要在线程内调用占用时间较多的函数,为保证各个线程的实时性要求,需要将这类函数进一步划分为更小的函数,分步执行。
    (3)使用ANSI C实现的Protothreads库采用了封装switch-case语句的方法,因此,按照C语言语法的要求,Protothreads不能与switch-case语句混用。但是,Protothreads库的另一种实现方式是采用了GCC编译器的一些扩展特性,这样的Protothreads库能够克服该缺点,但具有编译器的依赖性。
原文:http://www.zclw.net/article/sort040/sort044/info-31619.html

在某些应用中,这些局限性是不可接受的。

评分

参与人数 2威望 +11 收起 理由
hotpower + 10
dong_abc + 1

查看全部评分

hotpower 发表于 2011-5-2 19:07 | 显示全部楼层
真有你的,放玩风筝把主主函数贴出来
Swallow_0322 发表于 2011-5-2 20:14 | 显示全部楼层
上次休息想去放风筝,愣没找到哪里卖,o(∩_∩)o 哈哈
 楼主| dong_abc 发表于 2011-5-2 22:22 | 显示全部楼层
放风筝&&发代码=裸奔~~~
hotpower 发表于 2011-5-2 22:41 | 显示全部楼层
是裸奔,回调函数的应用。
murex 发表于 2011-5-2 22:42 | 显示全部楼层
;P那这主程序来放呀
 楼主| dong_abc 发表于 2011-5-2 23:43 | 显示全部楼层
楼上踢得好!!!
Swallow_0322 发表于 2011-5-3 08:35 | 显示全部楼层
跟着学习!:P
bnyuli 发表于 2011-5-3 13:58 | 显示全部楼层
需要明白的参数有多少是必须需要的
hotpower 发表于 2011-5-3 18:28 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-3 20:20 编辑

听了老师的课,感觉缺点远大于优点。
局部变量的禁止很是不便,甚至无法接受。
只能用全局或静态变量了。
 楼主| dong_abc 发表于 2011-5-3 19:31 | 显示全部楼层
//实际上这也不能严格意义上称为多线程,只不过封装的比较好,感觉和多线程差不多,可以实现多任务而已
像个小型的调度器

听john_lee老师一言,Protothread像个废品。没怎么听说过这种“多线程”框架。
本来只想发个水贴,没想到引来几位大师光临,感谢各位的精彩留言!
hotpower 发表于 2011-5-3 20:21 | 显示全部楼层
感觉还不如裸奔算了
sinanjj 发表于 2011-5-4 00:43 | 显示全部楼层
西服定做的好还是品牌的好?


品牌的比一般定做的好。但永远比高手定做的烂
123jj 发表于 2011-5-4 06:30 | 显示全部楼层
踢得好!!!

跟在大虾后面学习~~~
hotpower 发表于 2011-5-4 07:45 | 显示全部楼层
一般应用问题不大,复杂点不让用据局部变量有些不好。
mcu123AD 发表于 2011-5-5 21:27 | 显示全部楼层
下来试试
xiajinyuan 发表于 2011-5-7 13:01 | 显示全部楼层
azadaqdc 发表于 2011-5-11 09:34 | 显示全部楼层
紧跟大虾们的脚步。。。学习。。。
mochou 发表于 2011-5-12 18:27 | 显示全部楼层
顶一下吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部