历史上的今天
返回首页

历史上的今天

今天是:2025年07月02日(星期三)

正在发生

2021年07月02日 | uC/OS-II内核移植_时钟节拍函数使用的初步认识

2021-07-02 来源:eefocus

      断断续续看了uC/OS-II内核书和一两个实验,发现移植的第一部,就遇到时钟节拍处理不好的困难。这两天,又对其中的一个比较完善的例程作仔细的分析,初步有了一些认识。


      个人认为,移植的第一个问题,是解决时钟节拍的处理,过程如下:

一、首先在主函数中调用目标板初始化函数ARMTargetInit();主要是初始化要用到的定时器和外部中断;

二、在启动系统之前,调用函数ARMTargetStart(),打开Timer0中断;

三、启动系统OSStart();


      下面,详细说明上述过程的步骤:

      建立文件target.c和target.h


 

      target.c:

      void ARMTargetInit(void)
      {
             InitInterrupts();
             InitTimers();   
      }

      void InitInterrupts(void) //初始化中断模式
      {
          rINTCON=0x5;              // Non-vectored,IRQ enable,FIQ disable   
          rINTMOD=0x0;             // All=IRQ mode   
          rINTMSK=0X7FFFFFF;   // all interrupts disable.   
      } 

      void InitTimers(void)     //初始化Time0,作为系统始终节拍
      {
          rTCFG0=(MCLK>>1)/1000000-1; //预分频值      
          rTCFG1=0x00000000;      // mux0 = 1/2
 //定时器0输入时钟频率=MCLK/(预分频值+1)/除法值mux0,定时器0输入时钟频率为1MHz
          rTCNTB0= 1000000/OS_TICKS_PER_SEC;  //定时器0输出时钟频率为OS_TICKS_PER_SEC
          rTCMPB0= 0x0;
          rTCON=0x2;            //update mode for TCNTB0 and TCMPB0.
          rTCON=0x9;            //timer0 = auto reload, start
      }



 

void ARMTargetStart(void)   //启动定时中断和外中断EXINT0
{
       RequestSystemTimer();
       InstallSystemTimer();
}

 

void RequestSystemTimer(void)
{

      pISR_TIMER0= (unsigned)Timer0_Exception;  //设置Timer0中断函数地址
      pISR_EINT0 = (unsigned)Exint0_Exception;

      //这里可以设置任何中断!注意要添加对应的中断服务函数
}

void InstallSystemTimer(void)
{
      rINTCON=0x5;                                         //Non-vectored,IRQ enable,FIQ disable 
      rINTMSK=~( BIT_GLOBAL | BIT_TIMER0 );  //Default value=0x7ffffff
}

void Timer0_Exception(void)
{
       rI_ISPC=BIT_TIMER0;      //清除定时器0中断挂起位
       OSTimeTick();                 //注意:在进入中断后运行次语句前,必须禁止中断
}

void Exint0_Exception(void)
{
       rI_ISPC=BIT_EINT0;

       //此后可以打开中断
}

注意:OSTimeTick()是uC/OS-II系统函数!



 

target.h根据上面的.c文件,就很容易写出来。

      这里可能需要重点说明中断执行过程,也是个人的一点粗浅认识。以 Timer0中断为例:

      如果发生定时器Timer0中断,PC将跳转到pISR_TIMER0所在地址,根据44binit.s文件,分析可以知道(参考我的《ARM的中断处理过程》一文)函数Timer0_Exception()将得以执行! 

 

      关于节拍的产生过程以及相应的任务切换,将在下一个文件中谈到。

注意:我的文章多半是学习时产生的认识,需要今后的应用中验证。


推荐阅读

史海拾趣

AMS公司的发展小趣事

AMS(Austria Microsystems)公司是一家总部位于奥地利的半导体制造商,专注于开发和生产高性能的模拟半导体解决方案。以下是 AMS 公司发展的五个相关故事:

  1. 创立与早期阶段:AMS 公司成立于1981年,最初是一家从事晶圆制造的小型企业。公司创始人团队以其对半导体技术的深刻理解和创新能力,在短时间内取得了一定的成就。早期产品主要包括模拟集成电路(IC)和传感器,为医疗、汽车、工业等领域提供解决方案。

  2. 技术创新与产品扩展:随着市场需求的不断变化和技术的进步,AMS 公司不断进行技术创新,并扩展了产品线。公司致力于开发具有高性能、低功耗和小尺寸的模拟半导体产品,以满足智能手机、消费电子、工业自动化等领域的需求。公司的产品涵盖了光学传感器、环境传感器、声学传感器等多个领域。

  3. 全球化发展与市场拓展:AMS 公司通过不断拓展全球市场,加强与客户和合作伙伴的合作关系,实现了快速的业务增长。公司在欧洲、亚洲和美洲设立了多个销售办事处和生产基地,建立了完善的全球供应链和销售网络。公司的产品销售网络覆盖了全球范围,得到了国内外客户的广泛认可。

  4. 收购与合并:随着公司规模的扩大和市场竞争的加剧,AMS 公司通过收购和合并等方式不断强化自身实力。公司先后收购了一些技术领先的公司,扩大了产品线和市场份额。此举进一步提升了公司在模拟半导体领域的竞争优势,加速了公司的业务增长。

  5. 持续创新与未来展望:AMS 公司将继续致力于技术创新和产品研发,不断提升产品性能和品质水平。公司将关注新兴技术和市场趋势,积极布局未来的发展方向,包括人工智能、物联网、汽车电子等领域。同时,公司还将加强与客户和合作伙伴的合作,共同推动行业的发展和进步。

百佳(BAIJIA)公司的发展小趣事

百佳公司的创始人蔡永权,在改革开放初期,凭借敏锐的商业洞察力和对技术的执着追求,创立了中山市古镇百佳电子电器厂。初创时期,公司面临着资金短缺、设备简陋、市场竞争激烈等多重困难。然而,蔡永权带领团队坚持不懈,以质量为核心,通过不断改进生产工艺和提升产品质量,逐渐赢得了客户的信任和市场的认可。

Global Navigation Systems公司的发展小趣事
如果远程无线防盗报警系统无法报警,首先需要检查各个部件是否正常工作。可以依次检查探测器是否触发、发射机是否发射信号、接收控制器是否接收到信号并触发报警装置等。如果某个部件出现故障,需要及时进行维修或更换。同时,还需要检查系统的电源和通讯是否正常,确保系统能够稳定运行。
Franz Binder GmbH & Co公司的发展小趣事
远程无线防盗报警系统可以通过智能家居系统平台进行集成。通过智能家居系统的控制中心和通信协议,可以将防盗报警系统与家中的其他智能设备(如灯光、窗帘、空调等)进行联动控制。例如,当防盗报警系统触发报警时,可以自动关闭家中的门窗、开启灯光等,以吓退入侵者或提醒家庭成员注意安全。同时,用户还可以通过智能手机等终端设备远程查看和控制家中的安全状况和设备状态。
Advance Tapes公司的发展小趣事

随着电子行业的快速发展,对胶带产品的性能要求也越来越高。Advance Tapes公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并与多家高校和研究机构建立了合作关系。经过不懈努力,Advance Tapes成功开发出了一系列具有高性能、高可靠性的胶带产品,得到了广大客户的认可。

ERNI公司的发展小趣事

20世纪70年代,ERNI开始实施全球化战略。他们意识到,只有不断扩大市场份额,才能确保公司的长期稳定发展。因此,ERNI开始在欧洲、北美和亚洲等地设立销售处和生产基地,为全球客户提供创新且高品质的产品。这一战略的实施,不仅使ERNI的销售额大幅增长,还进一步巩固了其在全球连接器市场的领先地位。

问答坊 | AI 解惑

基于DSP的液晶模块的显示原理及实现

1 硬件电路接口的设计 图1给出了液晶显示模块的硬件电路接口设计框图,该系统采用TI公司的TMS320F206芯片(以下简称F206),其内部带有4KB的FLASH存储器,可以根据系统需要外挂EEPROM作为外部程序存储区。 SED1335控制器是日本EPSON公司生产 ...…

查看全部问答>

2010年1月16日,基于ARM的嵌入式系统软硬件开发讲座(北京)

作为全球性RISC标准的缔造者,ARM在嵌入式处理器领域中的霸主地位早已为大家所公认,目前行业中90%以上的嵌入式产品中都采用的是ARM系列的处理器。由于ARM公司本身是向芯片制造商提供知识产权,优异的体系结构和开放的平台,这就使得ARM处理器的应 ...…

查看全部问答>

刚知道LM3S CM3能挂SDRAM~~

刚知道LM3S CM3(比较新的9B系列)能挂SDRAM~~~…

查看全部问答>

proteus 问题

我把 74ls164 修改成  74ls164.bus 为什么在仿真的时候 提示 PIn ‘clock’ is not modelled. 怎么处理?…

查看全部问答>

用万用表测串口信号用哪个档

既然串口信号是脉冲信号,即属于交流电,为什么用直流档来测呢?用直流档测得的值是有效值吗?哪可不可以用交流档来测呢?这两个值相等吗?…

查看全部问答>

CETK下编译camera时kato.lib的问题

BUILD: [01:0000000117:ERRORE] kato.lib(kato.obj) : error LNK2019: unresolved external symbol XMLGetCommentStringW referenced in function \"public: int __cdecl CKato::BeginLevelV(unsigned long,unsigned short const *,char *)\" (?Beg ...…

查看全部问答>

急!在线等待!在evc 使用directshow时,用模拟器调试的时候,CoCreateInstance 失败!

怀疑是没有在模拟器上注册,然后我将\\Program Files\\Microsoft eMbedded C++ 4.0\\EVC\\WCE400\\TARGET\\X86\\REGSVRCE.EXE 拷贝到模拟器目录下,在命令行REGSVRCE.EXE msfilter.dll ,失败!提示loadlirary(msfilter.dll) failed 请各位大虾指 ...…

查看全部问答>

路由器的子设备列表 如何超时清除呢?

如果连接路由器的终端关闭,之前此终端在路由器的子设备列表的列表项如何超时清除呢? 如果无法清除,子设备列表满的话,就无法增加新的节点了。 [ 本帖最后由 ljt8015 于 2012-1-18 20:36 编辑 ]…

查看全部问答>

msp430f149用DS12C887显示时间的问题

昨天拿了块DS12C887的片子,想用149做一块时钟,用的是1602的屏,现在时间日期都能显示,可问题是就这么一直卡着不动了,而且时间和日期在软件里明明改了,可1602上显示的一直是2000年0月0日0分0秒……不知道怎么回事啊。程序是我自己按照DataSheet ...…

查看全部问答>

MSP430F149__ad

void Init_AD() {     P6SEL = 0x08;                                     // Enable A/D channel input ...…

查看全部问答>