功率电感生产厂家
联系我们
热门搜索
点击排行
推荐阅读
猜猜你喜欢的
技术知识 您所在的位置: 首页 > 技术知识

教你构造一个51单片机的实时操作系统

来源:    作者:    发布时间:2015-01-07 10:58:55    浏览量:

  除此之外,还可以发现任务的一个特点:当任务从(1)重新开始时,局部变量x和y是一个什么值并不在乎,即x和y即使在(3)之后改变了,也已经不再重要,不会影响程序的正确性。其实这一特点也是大部分任务,至少是太部分任务的大部分局部变量的一个共性——如果任务在整个执行过程中,不会(被占先)放弃CPU控制权,则其局部变量大多数并不需要进行特别的保护,即其作用域只是任务的当次执行,针对上面的代码,就是临界保护区内的代码区域。

  目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我国目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速度越来越快,也从一个侧面说明了51系列单片机在国内的生命力。

  多年来我们一直想找一个合适的实时操作系统,作为自己的开发基础。根据开发需求,整合一些常用的嵌入式构件,以节约开发时间,尽最大可能地减少开发工作量;另外,要求这个实时操作系统能非常容易地嵌入到小容量的芯片中。毕竟,大系统是少数的,而小应用是多数而广泛的。显而易见,μC/OS—II是不太适合于以上要求的,而Keil C所带的RTX Tiny不带源代码,不具透明性,至于其FULL版本就更不用说了。

  1 Keil C51与重入问题

  说到实时操作系统,就不能不考虑重入问题。对于PC机这样的大内存处理器而言,这似乎并不是一个很麻烦的问题,借用μC/OS—II RTOS的说法,即要求在重入的函数内,使用局部变量。但5l系列单片机堆栈空间很小,仅局限在256字节之内,无法为每个函数都分配一个局部堆空间。正是由于这个原因,Keil C51使用了所谓的可覆盖技术:

  ①局部变量存储在全局RAM空间(不考虑扩展外部存储器的情况);

  ②在编译链接时,即已经完成局部变量的定位;

  ③如果各函数之间没有直接或间接的调用关系,则其局部变量空间便可覆盖。

  正是由于以上的原因,在Keil C51环境下,纯粹的函数如果不加处理(如增加一个模拟栈),是无法重人的。那么在Keil C5l环境下,如何使其函数具有可重人性呢?下面分析在实时操作系统下面,任务的基本结构与模式:

  vold TaskA(void*ptr){

  UINT8 vaL_a;

  //其他一些变量定义

  do{

  //实际的用户任务处理代码

  }while(1);

  }

  void TaskB(void*ptr){

  UINT8 vaLb;

  //其他一些变量定义

  do{

  Funcl();

  //其他实际的用户任务处理代码

  )while(1);

  void Funcl(){

  UlNT8 v al_fa;

  //其他变量的定义

  //函数的处理代码

  }

  在上面的代码中,TaskA与TaskB并不存在直接或间接的调用关系,因而其局部变量val_a与val_b便是可以被互相覆盖的,即其可能都被定位于某一个相同的RAM空间。这样,当TaskA运行一段时间,改变了val_a后,TaskB取得CPU控制权并运行时,便插件电感可能会改变val_b。由于其指向相同的RAM空间,导致TaskA重新取得CPU控制权时,val—a的值已经改变,从而导致程序运行不正确,反过来亦然。另一方面,Funcl()与TaskB有直接的调用关系,因而其局一体成型电感器部变量val_fa与val_b不会被互相覆盖,但也不能保证其局部变量val_fa不会与TaskA或其他任务的局部变量形成可覆盖关系。

  将val_a、val_b以及val_fa等局部变量定义为静态变量(加上static指示符)可以解决这一问题。但问题是,定义大量的static类型变量,将导致RAM空间的大量占用,有可能直接导致RAM空间不够用。尤其是在一些小容量的单片机内,一般只有128或256字节,大量的静态变量定义,在如此小的RAM资源状况下显然就不太合适了。由此而有了另一种的解决方法,如下代码所示:

  void TaskC(void){

  UINT8 x,v;

  whlk(1){

  OS_ENTER_CR深圳电感器ITICAL();

  x=GetX(); (1)

  y=GetY(); (2)

  //任务的其他代码

  O模压电感器S_EXIT_CRITICAL(); (3)

  0SSleep(100); (4)

  • 智能功率模块:走向小型化与高效能图2:SPM模块的应用电路结构图使用BLDC马达进行节能处处可见,可以说是尘埃落定。其挑战在于以合理的成本在马达里集成一个复杂的电子控制电路,从而为用户提供服务。优化的功率驱动电路对马达具有巨大的提升

  • L6562D+OB2203的问题最近用L6562D+OB2203做了一个输入175-265VAC,输出90V1A的路灯电源,PFC电路单独调试OK,但是单独调试OB2203出现CC模式下开机带载启动,电源打嗝保护,空载启动然后带载就不会出现打

  • 一种空调用新型PFC的设计0 引言近年来,随着电子技术的发展,各种电子设备、家用电器可能产生的电流谐波和无功功率对电网的污染也越来越引起人们的重视。谐波的存在,不仅大大降低了输入电路的功率因数,而且可对公共电力系统造成污染,引

  •