uCOS_II 移植到友善之臂mini2440

发布时间:2024-06-25  

1. 准备源代码

在官网或者其他地方找到源代码,我所用版本为以前下载的版本号V2.51。源码有16个文件,其中体系结构无关的             

OS_CORE.C       OS_MBOX.C      OS_FLAG..C

OS_SEM.C        OS_Q.C           OS_MUTEX.C
OS_TASK.C       OS_TIME.C        OS_MEM.C
uCOS_II.C (没用到)       OS_CONFIG.H      uCOS_II.H
INCLUDE.H
与体系结构相关的文件有三个
OS_CPU.H       OS_CPU_A.S    OS_CPU_C.C
二.选取开发环境ADS 1.2。(编译器的选择要考虑是否可以生成可重入性代码)
三.修改和体系结构有关的文件。主要有OS_CPU.H OS_CPU_A.S OS_CPU_C.C
1.修改OS_CPU.H OS_CPU.H
主要是定义了一些和具体CPU相关的常量,预编译器相关的数据类型。其中需要修改的有:
OS_CRITICAL_METHOD=3 
这是关中断的方式,在这里选择OS_ENTER_CRITICAL(),而OS_ENTER_CRITICAL()  等价于(cpu_sr = OSCPUSaveSR()),这个函数在OS_CPU_A.S中,需要自己写。
#define  OS_STK_GROWTH        1
这是栈生长方向,ADS1.2开发环境arm920t的堆栈生长方向为递减的也就是说从高地址向低地址方向生长,而且是满栈型的,就是栈指针指向有效的数据。
2.修改OS_CPU_C.C
OS_CPU_C.C主要定义了OSTaskStkInit()这个函数和其他一些hook扩展函数。Hook扩展函数不用修改,保持空。OSTaskStkInit()是堆栈初始化函数,用在建立任务的函数OSTaskCreate()中,初始化任务的栈,在arm920t中需要在栈中保存的寄存器和数据为

  1. $task;          

  2. LR (R14)              

  3. R12                                                       

  4. R11                                                     

  5. R10                                                        

  6. R9                                                

  7. R8                                                         

  8. R7                                                     

  9. R6                                                         

  10. R5                                                       

  11. R4                                                         

  12. R3                                                         

  13. R2                                                         

  14. R1                                                         

  15. R0 :         (argument)  

  16. CPSR      (最后栈指针指到这里,这是栈的顶部,也就是最小的地址)  

所以堆栈初始化代码为下,可以看出任务堆栈不能小于16*4 byte,否则栈会溢出。

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

  2. {  

  3.     INT32U *stk;  

  4.   

  5.     opt    = opt;                   /* 'opt' is not used, prevent warning */  

  6.     stk    = (INT32U *)ptos;        /* Load stack pointer */  

  7.     *(stk)   = (OS_STK)task;        /* Entry Point            */  

  8.     *(--stk) = (INT32U)0;           /* LR (R14)           */  

  9.     *(--stk) = (INT32U)0;           /* R12                */  

  10.     *(--stk) = (INT32U)0;           /* R11                */  

  11.     *(--stk) = (INT32U)0;           /* R10                */  

  12.     *(--stk) = (INT32U)0;           /* R9                 */  

  13.     *(--stk) = (INT32U)0;           /* R8                 */  

  14.     *(--stk) = (INT32U)0;           /* R7                 */  

  15.     *(--stk) = (INT32U)0;           /* R6                 */  

  16.     *(--stk) = (INT32U)0;           /* R5                 */  

  17.     *(--stk) = (INT32U)0;           /* R4                 */  

  18.     *(--stk) = (INT32U)0;           /* R3                 */  

  19.     *(--stk) = (INT32U)0;           /* R2                 */  

  20.     *(--stk) = (INT32U)0;           /* R1                 */  

  21.     *(--stk) = (INT32U)pdata;           /* R0 : argument      */  

  22.     *(--stk) = (INT32U)0x00000013L;     /* CPSR               */  

  23.     return ((OS_STK *)stk);  

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>