tag 标签: 裸奔

相关博文
  • 热度 28
    2016-3-16 10:49
    1190 次阅读|
    8 个评论
      TQ2440 是由广州天嵌计算机科技有限公司精心打造的一款开发板。以稳定的性能,过硬的质量,丰富的扩展接口,优质的售后服务和技术支持,赢得众多企业的青睐和支持。   //=========================================   // NAME: main.c   // DESC: TQ2440串口UART打印printf测试程序   //=========================================   /* 头文件包含 */   #include "def.h"   #include "option.h"   #include "2440addr.h"   #include   #include   static volatile int uart_port = 0;   void uart_init(int pclk,int buad,int ch)   {   //UART初始化:端口使能、功能设定、波特率、设置数据格式   rGPHCON = (rGPHCON ~(0xfff4)) | (0xaaa4);//端口RX 、TX 功能   rGPHUP = rGPHUP | (0x71); //端口GPH 禁止上拉   rUFCON0 = 0x0; //禁止FIFO   rUFCON1 = 0x0; //禁止FIFO   rUFCON2 = 0x0; //禁止FIFO   rUMCON0 = 0x0; //禁止AFC   rUMCON1 = 0x0; //禁止AFC   //Normal:No parity:One stop:8-bits 中断响应 UART clock: PCLK   rULCON0 = (rULCON0 ~0xff) | ((0x06)|(0x03)|(0x02)|(0x3));   rUCON0 = (rUCON0 ~0x3ff) | ((0x19)|(0x16)|(0x12)|(0x1));   rUBRDIV0 = ((int)(pclk/16./buad+0.5)-1);   rULCON1 = (rULCON1 ~0xff) | ((0x06)|(0x03)|(0x02)|(0x3));   rUCON1 = (rUCON1 ~0x3ff) | ((0x19)|(0x16)|(0x12)|(0x1));   rUBRDIV1 = ((int)(pclk/16./buad+0.5)-1);   rULCON2 = (rULCON2 ~0xff) | ((0x06)|(0x03)|(0x02)|(0x3));   rUCON2 = (rUCON2 ~0x3ff) | ((0x19)|(0x16)|(0x12)|(0x1));   rUBRDIV2 = ((int)(pclk/16./buad+0.5)-1);   uart_port = ch; //设置串口端口号   }   void uart_send_byte(int data)   {   if(0 == uart_port)   {   if(data == 'n')   {   while(!(rUTRSTAT0 0x2));   rUTXH0 = 'n';   }   while(!(rUTRSTAT0 0x2));   rUTXH0 = data;   }   else if(1 == uart_port)   {   if(data == 'n')   {   while(!(rUTRSTAT1 0x2));   rUTXH1 = 'n';   }   while(!(rUTRSTAT1 0x2));   rUTXH1 = data;   }   else if(2 == uart_port)   {   if(data == 'n')   {   while(!(rUTRSTAT2 0x2));   rUTXH2 = 'n';   }   while(!(rUTRSTAT2 0x2));   rUTXH2 = data;   }   }   void uart_send_string(char *string)   {   while(*string)   {   uart_send_byte(*string++);   }   }   void uart_printf(char *fmt,...)   {   va_list ap;   char string ;   va_start(ap,fmt);   vsprintf(string,fmt,ap);   uart_send_string(string);   va_end(ap);   }   void Main(void)   {   int plck_val = 50000000;   int buad_val = 115200;   int ch_val = 0;   uart_init(plck_val,buad_val,ch_val);   uart_printf("PCLK is %d,buad is %d,uart_port is %d n",plck_val,buad_val,ch_val);   while(1);   }   感谢晨旭晚霞的支持!   供货情况:   天嵌科技提供专业嵌入式板卡和行业解决方案。如有需要,可以联系天嵌科技的销售人员。   销售电话:020-38219416 38373101   技术支持:020-38219416转807 820   网址:http://www.embedsky.com
  • 热度 23
    2014-9-8 00:14
    2356 次阅读|
    1 个评论
    背景任务的几种常见调度方式   我们喜欢RTOS,因为它足够简单;我们讨厌RTOS,因为它足够复杂。从“裸奔”到RTOS,首先意味着工程师们要去适应这些“新”东西,更要命的是要去给BOSS证明这些东西的可靠性——这是一个足够漫长的过程。在如今RTOS飞舞的时代,我们依然一路“裸奔”。呃,严重跑题了~~我不想说RTOS,我要说的是“裸奔”下的几种“风骚走位”——调度方式。   相对于RTOS,“裸奔”属于“前后台”框架。形象地说,后台就是那些在main()的超级循环里面的执行的函数集合;前台就是那些在ISR中执行的函数集合。其中,前台程序通常是对实时性能要求较为严格的任务,通常也是系统的核心任务。因此,后台程序就被称为“背景任务”。   下面讲讲几种背景任务的调度方式: l  方式1——非周期连续执行 这种方式应该是任何MCU初学者都会用到的,如下: 遥想当年瞎捣鼓51单片机时,全身上下只知道写个main(),硬生生在里面写了个电子日历=。= 本着“尽快跑”的简单实惠原则,方式1实现了一个闭环,非常适合应用于那些足够低端的MCU。(当然也不要指望这种情况下跑大量的实时code)   l  方式2——周期执行 相对于方式1,方式2强调了执行的“周期”实现。意味着设计者希望这些代码可以按照固定周期执行。如下: 方式2应用场合更为广泛一些。需要注意的是:即使前台任务足够短小,也只有首个任务A是较为实时的,后续任务都要受到前一个任务的执行时间影响,从而变得更加不实时——这是固有的缺陷。还有,如果多个任务的周期存在倍数关系,那么将会造成CPU负荷不均衡——即“忙就忙死,闲就闲死”现象。 另外还可以看出这些背景任务的执行周期是相同的(假设各任务的执行时间固定),那么我们可以说这些任务具有统一的速率。但是,如果我们希望不同任务有不同的速率呢?请看方式3.   l  方式3——周期多速率执行 这里多速率,指的就是不同任务具有不同的执行周期。周期越短的任务通常是被认为优先级越高的任务。如下: 如上图所示,类似(A-B1-C1-D1)组成了一个小环,若干个这样的小环组成一个大环。 假设节拍timeout表示1ms,那么各任务的执行周期如下: 任务 执行周期 (ms) 优先级 A 1 最高 B1 2   高 B2 2 C1 3   中 C2 3 C3 3 D1 4     低 D2 4 D3 4 D4 4     对比方式2,方式3显然的一个好处就是可以实现CPU负荷相对均衡。但是可以看出,方式3同样存在方式2中所说缺陷:即使前台任务足够短小,也只有首个任务A是较为实时的,后续任务都要受到前一个任务的执行时间影响,从而变得更加不实时。   如何尽量确保背景任务的实时性 : 作为背景任务,自然不能指望他们拥有与前台任务一样的实时性能。但是也总不能落后太多吧 _ 下面的分析是基于前台任务的运行时间为常数。 (1)对于方式2,显然,只要在同一个环内,任务A~F的执行时间之和(包括前台任务占用的时间)小于timeout周期,即可相对保证背景任务的实时性能。 (2)对于方式3,只要在同一个 小环 内,任务A~D的执行时间之和(包括前台任务占用的时间)小于timeout周期,即可相对保证背景任务的实时性能。   结语 不管是跑RTOS还是“裸奔”,对系统的时序分析都是至关重要的,其分析深度往往体现了工程师对软件整体的把握程度。个人经验认为,“裸奔”足以应付大多数的单片机系统设计;至于RTOS嘛,要么就不用,要么就用最好的——包括人和产品。