历史上的今天
返回首页

历史上的今天

今天是:2025年08月11日(星期一)

正在发生

2021年08月11日 | ucos-ii在MC9S12XDP512上的移植

2021-08-11 来源:eefocus

      搞了几天,总算把ucos-ii移植到MC9S12XDP512上了。做个简短的笔记。


      ucos-ii版本:2.52, 编译器:Freescale CodeWarrior5.9 芯片:MC9S12XDP512


      移植步骤:


      1.  根据向导建立新的工程,芯片选择MC9S12XDP512,其余默认配置;


      2.  将ucos-ii通用源文件复制到工程的Sources目录下下:OS_CORE.C,OS_DBG.C,OS_FLAG.C,OS_MBOX.C,OS_MEM.C,


      OS+MUTEX.C,OS_Q.C,OS_SEM.C,OS_TASK.C,OS_TIME.C,uCos_II.H,os_cfg.h并将这些文件添加到工程中;


      3. 创建新文件,并命名为includes.h,将其添加到工程中,includes.h文件内容为:

#include       /* common defines and macros */

#include "derivative.h"      /* derivative-specific definitions */

#include           // memset函数头文件

#include   

#include   

#include   

#include    "OS_CPU.H"

#include    "os_cfg.h"

#include    "uCOS_II.H"


      4. 创建新文件OS_CPU.H,并将其添加到工程中,OS_CPU.H文件内容为:

#ifdef  OS_CPU_GLOBALS

#define OS_CPU_EXT

#else

#define OS_CPU_EXT  extern

#endif

typedef unsigned char  BOOLEAN;

typedef unsigned char  INT8U;                    /*   8 bit                    */

typedef signed   char  INT8S;                    /*   8 bit                    */

typedef unsigned int   INT16U;                   /*   16 bit                   */

typedef signed   int   INT16S;                   /*   16 bit                   */

typedef unsigned long  INT32U;                   /*   32 bit                   */

typedef signed   long  INT32S;                   /*   32 bit                   */

typedef float          FP32;                     /*                 */

typedef double         FP64;                     /*                 */

typedef unsigned char   OS_STK;                   /*                */

typedef unsigned char   OS_CPU_SR;                // CCR 8 bits

#define  OS_CRITICAL_METHOD    3

#if      OS_CRITICAL_METHOD == 1

#define  OS_ENTER_CRITICAL()  

#define  OS_EXIT_CRITICAL()  

#endif

#if      OS_CRITICAL_METHOD == 2

#define  OS_ENTER_CRITICAL()                           

#define  OS_EXIT_CRITICAL()                    

#endif

#if      OS_CRITICAL_METHOD == 3

#define  OS_ENTER_CRITICAL()  asm tpa;asm sei;asm staa cpu_sr    /* Disable interrupt */

#define  OS_EXIT_CRITICAL()   asm ldaa cpu_sr;asm tap        /* Enable interrupt                        */

#endif

#define  OS_STK_GROWTH        1              /* top to bottom            */

#define  OS_TASK_SW()         asm swi   /* software interrupt                */


      5. 创建新文件os_cpu_c.c,并添加到工程中,os_cpu_c.c文件内容较多,主要有以下部分:


      1. 以下函数均为空: OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskIdleHook(),


          OSTaskStatHook(),OSTimeTickHook(),OSInitHookBegin(),OSInitHookEnd(),OSTCBInitHook(),


      2. OSTaskStkInit()函数内容: 该函数主要模拟中断产生时CPU的压栈过程,根据芯片资料(IS12CpuV1.pdf),中断的压栈次序为:


          SP+7  RTNH:RTNL  (返回地址)

          SP+5  Y

          SP+3  X

          SP+1  D(B:A)

          SP      CCR


        由上,OSTaskStkInit()内容为:

// =============================================

// 模拟中断产生初始化堆栈

// 中断产生时,堆栈压栈过程: (参见9S12cpuV1.pdf P381)

/*

    SP+7  RTNH:RTNL  (返回地址)

    SP+5  Y

    SP+3  X

    SP+1  D(B:A)

    SP    CCR

*/

// =============================================

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)

{

    INT16U *wstk;

    INT8U  *bstk;

 

    opt     = opt;                           // 'opt' is not used, prevent warning                     

    wstk    = (INT16U *)ptos;                // Load stack pointer                                     

    *--wstk = (INT16U)pdata;                 // Simulate call to function with argument                

    *--wstk = (INT16U)(((INT32U)task) >> 8); // Return address.  Format: PCH:PCL:PPAGE (cut out PPage) 

                                             // 函数地址构成: PCH:PCL:PPAGE

                                             

    *--wstk = (INT16U)(((INT32U)task) >> 8);                                           

    // 存储Y,X,D,CCR的当前值,实际任务还未开始,因此,X,Y,D,等也未用,可以随便取值,此处都取0

    *--wstk = (INT16U)0x0;                   // Y Register                                            

    *--wstk = (INT16U)0x0;                   // X Register                                             

    *--wstk = (INT16U)0x0;                   // D Register                                                

    bstk    = (INT8U *)wstk;                 // Convert WORD ptr to BYTE ptr to set CCR                

    *--bstk = (0xC0);                        // CCR Register (Disable STOP instruction and XIRQ)      

    *bstk = (INT8U)task;                   // Save the PPAGE register                               

                                             // 地址低8位为PPAGE 

    return ((OS_STK *)bstk);                 // Return pointer to new top-of-stack                     

}

      3. 由于CodeWarrior可以内联汇编,因此将以下4个需要由汇编编写的函数也放于Os_cpu_c.c中:OSStartHighRdy(),


          OSCtxSw(), OSIntCtxSw(),OSTickISR().注意,这4个函数都应该编写在非分页区,4个函数的内容为:

#pragma CODE_SEG  NON_BANKED

void OSStartHighRdy(void)

{

OSTaskSwHook();           //Call Hook function

asm

{

ldx OSTCBCur;          // load the value in OSTCBCur or 

                       // 偏移量0,此处实际为堆栈指针地址

lds 0,x;

inc OSRunning;           //OSRunning = 1

pula;                 // 弹出PPAGE

staa PPAGE;

nop;

rti;

}

}

void OSIntCtxSw(void)

{

OSTaskSwHook();         //Call Hook function

OSTCBCur = OSTCBHighRdy; //change OSTCBCur and OSPrioCur

OSPrioCur = OSPrioHighRdy;

asm

{

ldx OSTCBCur;         //Get the new task's TCB's address

lds 0,x;

pula;

staa PPAGE;

rti;

}   

}

void interrupt 4 OSCtxSw(void)     /*swi interrupt */

{

asm

{

  // 保存PPAGE

  ldaa PPAGE;

  psha;

  nop;

  // 在当前任务控制块中保存当前任务的堆栈指针

  ldx OSTCBCur;

推荐阅读

史海拾趣

Geyer Electronic E K公司的发展小趣事

Geyer Electronic E.K.公司的发展故事

故事一:创立与初步发展

Geyer Electronic E.K.公司由Rudolf Geyer于1964年创立,最初是一家位于慕尼黑莱姆区的电子产品零售店。在那个年代,电子产品行业正处于快速发展阶段,Geyer凭借其敏锐的市场洞察力和对技术的热情,逐渐在市场中站稳了脚跟。起初,店铺销售各类电子产品,从简单的收音机到复杂的电子设备,一应俱全。随着时间的推移,Geyer Electronic凭借其优质的服务和丰富的产品线,逐渐赢得了当地消费者的信任和支持。

故事二:转型与专业化

1992年,Geyer Electronic经历了一次重要的转折点。在Jürgen Reichmann的领导下,公司被收购并进行了战略调整,正式转型为一家专门从事频率产品和特殊电池的公司。这一转型标志着Geyer Electronic开始专注于某一特定领域,并致力于在该领域成为行业的领导者。公司投入大量资源进行技术研发和产品创新,不断推出符合市场需求的高质量频率产品和特殊电池,逐渐在行业内树立了良好的口碑。

故事三:全球化布局

随着业务的不断扩展,Geyer Electronic开始将目光投向全球市场。公司不仅在欧洲建立了稳固的市场地位,还逐渐将业务拓展到亚洲和美国等其他地区。为了实现全球化战略,Geyer Electronic加强了与全球合作伙伴的合作与交流,共同推动频率产品和特殊电池技术的创新与发展。同时,公司还建立了完善的全球销售网络,确保产品能够在短时间内送达全球各地的客户手中。

故事四:认证与品质保证

为了进一步提升产品质量和客户满意度,Geyer Electronic积极寻求国际认证。公司通过了DIN ISO 9001:2015等国际质量管理体系认证,这标志着Geyer Electronic在质量管理方面已经达到了国际先进水平。通过严格的质量控制和持续的技术创新,Geyer Electronic不断推出高品质的频率产品和特殊电池,赢得了全球客户的广泛认可和信赖。

故事五:搬迁与未来发展

为了满足未来发展的需要,Geyer Electronic于2022年搬到了位于Planegg的新公司所在地。这次搬迁不仅为公司提供了更加宽敞和现代化的办公和生产环境,还为公司未来的发展奠定了坚实的基础。在新的起点上,Geyer Electronic将继续秉承“质量第一、客户至上”的经营理念,不断推动技术创新和产品升级,为全球客户提供更加优质、高效的服务和解决方案。同时,公司还将积极探索新的市场领域和发展机遇,努力成为全球电子行业中的佼佼者。

Global Connector Technology公司的发展小趣事
负载的突然变化可能导致电流波动,影响继电器的判断。
Dae Ryung Electronic Co Ltd公司的发展小趣事

随着电子行业的不断发展和变革,Dae Ryung Electronic Co Ltd公司也面临着前所未有的挑战。为了应对这些挑战,公司积极调整战略和业务结构,加强在物联网、人工智能等新兴领域的研发和应用。同时,公司还注重人才培养和引进,吸引了一批高素质的技术和管理人才加入公司。这些努力使得公司在面对行业变革时能够保持领先地位并实现可持续发展。

General Instrument公司的发展小趣事
线路中存在异常干扰信号,使保护器接收到错误的电压信号。
Amphion Semiconductor Ltd公司的发展小趣事
保护器的设定值或内部元件过于敏感,导致在电压稍有波动时就触发保护机制。
高通(GENITOP)公司的发展小趣事

70年代,全球电子产品热潮兴起,金山工业决定进军这一领域。公司推出了碱性和氧化的银钮型电池,这些产品广泛应用于电子手表、计算机等小型电子设备中。这一战略转型不仅丰富了超霸电池的产品线,也进一步提升了其在电子行业的知名度。随着技术的不断积累,超霸电池逐渐在市场中占据了一席之地。

问答坊 | AI 解惑

火灾报警远程  锁定火灾地点只三秒

常熟火灾自动报警远程监控中心昨天启用,在一间一百多平方米的监控室里,借助远程视频监控系统,接警人员只需短短3秒钟,就能迅速掌握联网单位的消防安全情况。常熟是继太原之后的全国第二家使用这一火灾报警系统的城市。      ...…

查看全部问答>

【ATMEL技术问题】关于KEIL下AT91R40008启动代码问题

用KEIL 软件建立一个工程,自动生成一个启动代码STartup.S ; 但是问题来了,这个代码有点不知所云,编译出错哦啊,请大侠指点!下面是代码 /*****************************************************************************/;/* STARTUP.S: Start ...…

查看全部问答>

菜鸟提问:SHBrowseForForlder()不能用,怎么代替

我是个初学者,我这个平台不能使用SHBrowseForForlder()这个方法,想找另外一个方法来代替SHBrowseForFolder,达到相同的效果, 或者可以不用打开浏览文件夹着个对话框,直接可以保存文件到指定目录也可以。劳驾各位帮忙啊…

查看全部问答>

请教一个evc编译器的问题

evc的directories 设置多行的时候(7行).会自动清空..这个是什么原因,怎么解决呢? …

查看全部问答>

关于pc104总线驱动的制作

小弟刚刚做了一块基于pc104总线的DA板卡,但是现在要与基于pc104总线的3350主板进行交互,主要是对pc104总线的数据进行读取,需要制作驱动,小弟第一次开发,有那位大侠能够给一个例子或其他的资料,多谢…

查看全部问答>

在NXP可以申请LM拉!

找PDF居然发现这个好玩的…

查看全部问答>

【课后练习】LaunchPad课后练习七之定时器

课后练习七之定时器   (定时器看起来简单,却搞了好久,和之前的430定时器不太一样,看了很多次,还有很多没弄出来的地方,有几个地方还是没懂) 1.TIMER_A由以下部分组成 [1] 计数器部分 输入的时钟源具有4种选择,所选择的时钟源又可 ...…

查看全部问答>

LM3S管脚不能被程序设置为高,背光灯不能点亮

最近受打击不小,这是第三块板子了,还是有问题需要向大家求助。 开发环境概况: MCU:    LM3S5C56 Rev A2, 512 KB flash 64KB SRAM, 64 LQFPJ-LINK: V8, DLL version是最新 V4.52cIAR:        Embedded ...…

查看全部问答>