打印
[新手园地]

发个帖子出去放风筝

[复制链接]
13292|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dong_abc|  楼主 | 2011-5-2 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dong_abc 于 2011-5-2 22:15 编辑

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

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

 
/*******************************************************************
main.c file
作者:dong_abc
建立日期: 2011.05.01(2011年劳动节)
修改日期:
版本:V1.0
版权自由,欢迎盗版
Copyright(C) Anybody of Nuvoton MCU lover
All rights reserved            
********************************************************************/
#include "main.h"
/********************************************************************
函数功能:系统初始化。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void Sys_Init(void)
{
UNLOCKREG();              // 芯片注册解锁
  SYSCLK->WRCON.XTL12M_EN = 1;    // 设定12M外部晶振
DrvSYS_Delay(5000);         // 等待时钟就绪
SysTick_Init();           // 系统节拍及中断初始化配置
Timer0_Init();           // 定时器初始化配置
Uart_Init();            // 串口初始化配置
ADC_Init();             // ADC初始化配置
Seg7_Init();            // 数码管初始化配置
Key_Init();             // 按键初始化配置
}
/********************************************************************
函数功能:20ms弱实时回调处理函数。
入口参数:无。
返    回:无。
备    注:盗版农民讲习所的《建立MCU通用处理程序》。
     本来要做成芯唐库里类似的回调函数,那种固定模式非常好,只是
     n个名字类似的指针变量和函数实在让人晕
********************************************************************/
void Weekness_20msCallback(void)
{
Key_Proc();
}
/********************************************************************
函数功能:5ms弱实时回调处理函数。
入口参数:无。
返    回:无。
备    注:盗版农民讲习所的《建立MCU通用处理程序》。
********************************************************************/
void Weekness_5msCallback(void)
{
Seg7_Fresh();
}
/********************************************************************
函数功能:系统主函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
int main (void)
{
                              
Sys_Init();
SysTimer_WeeknessRegister( Weekness_20msCallback, Weekness_5msCallback );
  
while(1)
{
  
}
}



//SysTick.c  file

#include "SysTick.h"
//系统系统节拍计数器变量及弱实时任务函数指针
struct InSysTimer {      
void ( *Weekness_20ms )();       //20ms弱实时任务函数指针
void ( *Weekness_5ms )();        //5ms弱实时任务函数指针
  uint32_t SysTickCnt;             //系统节拍计数器
};
struct InSysTimer sInSysTimer;
/********************************************************************
函数功能:系统节拍及中断初始化配置。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void SysTick_Init(void)
{
SysTick_Config(12000000/(100*2));        //5ms系统节拍中断
}

/********************************************************************
函数功能:系统节拍中断函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void SysTick_Handler(void)
{
sInSysTimer.SysTickCnt++;
//500ms时钟节拍
if(sInSysTimer.SysTickCnt%100==0)  
{
  //系统运行指示灯
  //outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->PIN) ^ (1 << 5));  
  outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->PIN) ^ 0x007c);
  sInSysTimer.SysTickCnt=0;
}   
//20ms弱实时任务函数
if(sInSysTimer.SysTickCnt%4==0)
{      
  if(sInSysTimer.Weekness_20ms) (*sInSysTimer.Weekness_20ms)();
}
  
//10ms弱实时任务
if(sInSysTimer.SysTickCnt%2==0)
{     
   
}
//5ms弱实时任务函数
if(sInSysTimer.Weekness_5ms) (*sInSysTimer.Weekness_5ms)();
}
/********************************************************************
函数功能:注册弱实时任务处理函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void SysTimer_WeeknessRegister( void(*Function_20ms)(), void(*Function_5ms)() )
{
sInSysTimer.Weekness_20ms = Function_20ms;
sInSysTimer.Weekness_5ms  = Function_5ms;
}



NUC1xx_Demo_V1.0.rar (436.19 KB)

相关帖子

来自 2楼
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 哈哈

使用特权

评论回复
5
dong_abc|  楼主 | 2011-5-2 22:22 | 只看该作者
放风筝&&发代码=裸奔~~~

使用特权

评论回复
6
hotpower| | 2011-5-2 22:41 | 只看该作者
是裸奔,回调函数的应用。

使用特权

评论回复
7
murex| | 2011-5-2 22:42 | 只看该作者
;P那这主程序来放呀

使用特权

评论回复
8
dong_abc|  楼主 | 2011-5-2 23:43 | 只看该作者
楼上踢得好!!!

使用特权

评论回复
9
Swallow_0322| | 2011-5-3 08:35 | 只看该作者
跟着学习!:P

使用特权

评论回复
10
bnyuli| | 2011-5-3 13:58 | 只看该作者
需要明白的参数有多少是必须需要的

使用特权

评论回复
11
hotpower| | 2011-5-3 18:28 | 只看该作者
本帖最后由 hotpower 于 2011-5-3 20:20 编辑

听了老师的课,感觉缺点远大于优点。
局部变量的禁止很是不便,甚至无法接受。
只能用全局或静态变量了。

使用特权

评论回复
12
dong_abc|  楼主 | 2011-5-3 19:31 | 只看该作者
//实际上这也不能严格意义上称为多线程,只不过封装的比较好,感觉和多线程差不多,可以实现多任务而已
像个小型的调度器

听john_lee老师一言,Protothread像个废品。没怎么听说过这种“多线程”框架。
本来只想发个水贴,没想到引来几位大师光临,感谢各位的精彩留言!

使用特权

评论回复
13
hotpower| | 2011-5-3 20:21 | 只看该作者
感觉还不如裸奔算了

使用特权

评论回复
14
sinanjj| | 2011-5-4 00:43 | 只看该作者
西服定做的好还是品牌的好?


品牌的比一般定做的好。但永远比高手定做的烂

使用特权

评论回复
15
123jj| | 2011-5-4 06:30 | 只看该作者
踢得好!!!

跟在大虾后面学习~~~

使用特权

评论回复
16
hotpower| | 2011-5-4 07:45 | 只看该作者
一般应用问题不大,复杂点不让用据局部变量有些不好。

使用特权

评论回复
17
mcu123AD| | 2011-5-5 21:27 | 只看该作者
下来试试

使用特权

评论回复
18
xiajinyuan| | 2011-5-7 13:01 | 只看该作者
:(

使用特权

评论回复
19
azadaqdc| | 2011-5-11 09:34 | 只看该作者
紧跟大虾们的脚步。。。学习。。。

使用特权

评论回复
20
mochou| | 2011-5-12 18:27 | 只看该作者
顶一下吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

43

主题

5074

帖子

22

粉丝