历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2020年11月09日 | ucosi操作系统移植到STM32

2020-11-09 来源:eefocus

这个工作主要是根据网友的经验资料来学习移植的。总的来说需要下面几个参考资料。


ARM Cortex-m3权威指南


官方移植文档资料


网友移植成功经验资料


这三种资料在我的资源上传里面都能找到。


我在官网上下的是官方已经移植好的到STM32F103评估板的资料,很多部分已经实现了,所以需要改动的地方很少,不同的地方可以参考第三种网友移植成功经验资料,里面有详细说明。我下的是ucosii2.86版本。


下面说说移植过程:


移植主要涉及到两个源文件,os_cpu_c.c和os_cpu_a.asm,os_cpu.h。其他文件是ucosii核心文件,不需要修改。还有两个配置文件app_cfg.h和os_cfg.h。


整个文件框架构成图如下,用的是IAR。




这就是对照上面的说明而设置的目录结构。


下面谈主要移植的部分。主要集中在os_cpu_a.asm这个文件中,os_cpu.h主要涉及到一些宏的配置。os_cpu_c.c中主要有一个函数必须写出,就是堆栈初始化函数。


先说os_cpu.h中需要注意的地方。


下面是开关中断的宏


#define  OS_CRITICAL_METHOD   3  

  

#if OS_CRITICAL_METHOD == 3  

#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}  

#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}  

#endif  


CM3堆栈方向高到底递减,设置为1,还有一个任务切换的宏。


#define  OS_STK_GROWTH        1                   /* Stack grows from HIGH to LOW memory on ARM        */  

  

#define  OS_TASK_SW()         OSCtxSw()  


还有几个关于systick的函数需要注释掉,下面的os_cpu_c.c会说道原因。


//                                                  /* See OS_CPU_C.C                                    */  

//void       OS_CPU_SysTickHandler(void);  

//void       OS_CPU_SysTickInit(void);  

//  

//                                                  /* See BSP.C                                         */  

//INT32U     OS_CPU_SysTickClkFreq(void);  

 


看os_cpu_c.c。


里面有些函数是钩子函数,根据需要写。如果不需要可以不写。


下面是堆栈初始化函数。


/* 

********************************************************************************************************* 

*                                        INITIALIZE A TASK'S STACK 

* Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the 

*              stack frame of the task being created.  This function is highly processor specific. 

* Arguments  : task          is a pointer to the task code 

*              p_arg         is a pointer to a user supplied data area that will be passed to the task 

*                            when the task first executes. 

*              ptos          is a pointer to the top of stack.  It is assumed that 'ptos' points to 

*                            a 'free' entry on the task stack.  If OS_STK_GROWTH is set to 1 then 

*                            'ptos' will contain the HIGHEST valid address of the stack.  Similarly, if 

*                            OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address 

*                            of the stack. 

*              opt           specifies options that can be used to alter the behavior of OSTaskStkInit(). 

*                            (see uCOS_II.H for OS_TASK_OPT_xxx). 

* Returns    : Always returns the location of the new top-of-stack once the processor registers have 

*              been placed on the stack in the proper order. 

* Note(s)    : 1) Interrupts are enabled when your task starts executing. 

*              2) All tasks run in Thread mode, using process stack. 

********************************************************************************************************* 

*/  

  

OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)  

{  

    OS_STK *stk;  

  

  

    (void)opt;                                   /* 'opt' is not used, prevent warning                 */  

    stk       = ptos;                            /* Load stack pointer                                 */  

  

                                                 /* Registers stacked as if auto-saved on exception    */  

    *(stk)    = (INT32U)0x01000000L;             /* xPSR                                               */  

    *(--stk)  = (INT32U)task;                    /* Entry Point                                        */  

    *(--stk)  = (INT32U)0xFFFFFFFEL;             /* R14 (LR) (init value will cause fault if ever used)*/  

    *(--stk)  = (INT32U)0x12121212L;             /* R12                                                */  

    *(--stk)  = (INT32U)0x03030303L;             /* R3                                                 */  

    *(--stk)  = (INT32U)0x02020202L;             /* R2                                                 */  

    *(--stk)  = (INT32U)0x01010101L;             /* R1                                                 */  

    *(--stk)  = (INT32U)p_arg;                   /* R0 : argument                                      */  

  

                                                 /* Remaining registers saved on process stack         */  

    *(--stk)  = (INT32U)0x11111111L;             /* R11                                                */  

    *(--stk)  = (INT32U)0x10101010L;             /* R10                                                */  

    *(--stk)  = (INT32U)0x09090909L;             /* R9                                                 */  

    *(--stk)  = (INT32U)0x08080808L;             /* R8                                                 */  

    *(--stk)  = (INT32U)0x07070707L;             /* R7                                                 */  

    *(--stk)  = (INT32U)0x06060606L;             /* R6                                                 */  

推荐阅读

史海拾趣

G24 Innovations公司的发展小趣事

进入21世纪第二个十年,电子行业迎来了前所未有的变革。新技术、新产品的不断涌现,给传统企业带来了巨大挑战。远阳公司敏锐地意识到这一点,迅速启动了转型升级战略。公司加大了对新技术、新工艺的研发投入,不断提升产品的技术含量和附加值。同时,远阳还积极探索智能制造、绿色生产等新模式,推动企业向高质量发展迈进。这一系列的举措,使远阳在激烈的市场竞争中保持了领先地位。

GSME Electronics公司的发展小趣事

GSME Electronics深知品质是企业发展的生命线。因此,公司积极寻求并通过了ISO9001:2000质量管理体系、ISO14001环境管理体系以及IECQ QC080000危害物质流程管理体系等三项认证。同时,公司还遵循欧盟ROHS指令,通过了无铅、汞、无公害认证,确保产品符合国际环保标准。这些举措不仅提升了公司的市场竞争力,也赢得了国内外客户的广泛认可。

FutureWafer公司的发展小趣事

GSME Electronics深知品质是企业发展的生命线。因此,公司积极寻求并通过了ISO9001:2000质量管理体系、ISO14001环境管理体系以及IECQ QC080000危害物质流程管理体系等三项认证。同时,公司还遵循欧盟ROHS指令,通过了无铅、汞、无公害认证,确保产品符合国际环保标准。这些举措不仅提升了公司的市场竞争力,也赢得了国内外客户的广泛认可。

ATO SOLUTION公司的发展小趣事

随着公司规模的扩大,ATO SOLUTION公司开始实施全球化战略布局。公司先后在多个国家和地区设立了研发中心和生产基地,充分利用当地资源和市场优势,提升整体竞争力。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和创新。

Honda Tsushin Kogyo Co Ltd公司的发展小趣事

Honda Tsushin Kogyo在发展的过程中,可能形成了独特的企业文化和社会责任感。公司注重员工培训和团队建设,为员工提供良好的工作环境和发展机会。同时,公司还积极参与社会公益事业,通过捐赠、志愿服务等方式回馈社会。这些举措不仅提升了企业的社会形象,还增强了员工的归属感和凝聚力。在企业文化和社会责任的引领下,Honda Tsushin Kogyo实现了经济效益和社会效益的双赢。

需要注意的是,由于Honda Tsushin Kogyo的具体发展历程和详细故事可能并不完全公开,以上内容主要基于一般性的电子行业发展趋势和企业发展规律进行推测和整理。

ALTERA(阿尔特拉)公司的发展小趣事

为了进一步扩大市场份额,Honda Tsushin Kogyo可能实施了全球化战略。公司积极寻求国际合作机会,与全球范围内的电子产品制造商建立了稳定的合作关系。同时,公司还可能在海外设立生产基地或销售网点,以便更好地服务当地市场。通过全球化战略的实施,Honda Tsushin Kogyo不仅提升了品牌知名度,还增强了企业的国际竞争力。

问答坊 | AI 解惑

论文,包含程序,实现FFt算法的蝶式算法原理简述

本帖最后由 paulhyde 于 2014-9-15 03:26 编辑 论文,包含程序,实现FFt算法的蝶式算法原理简述    …

查看全部问答>

艾克赛尔(Axelwave)实现隧道无线宽带传输应用

近日,艾克赛尔(Axelwave)无线网络成功将自己的高品质无线网络设备应用到隧道宽带传输应用当中,建立了一条带宽最高可达近30Mbps的直接从隧道内到隧道外的无线传输链路。为隧道内中长距离,高带宽的无线应用开辟了新的天地。 这条隧道位于陕西省 ...…

查看全部问答>

旋转时钟+无限供电

LPC1114 体积小巧,功耗低正符合我的旋转时钟,旋转时钟不是什么新颖的东西了,我以前做了一个,用MAGE128 做的控制,体积有点大,我的是SPI通讯很多引脚没用。由于用无线供电所以要求系统功耗要低,所以感觉LPC11114很适合。所以(*^__^*) 嘻嘻…… ...…

查看全部问答>

2440->2410 eboot.

有没有那位大虾把2440的EBOOT移植到2410的板上过,我搞了一天都没搞好,哎,应该改的都改了,就是不能运行,奇怪哉! 请各位高手说说自己的想法,小弟不剩感激. 之所以有这个想法是因为2410的EBOOT差得要死,无BOOTPART部分,如果在2410的EBOOT上增 ...…

查看全部问答>

帮忙分析下

背景:    芯片A,B (A,B烧有同功能的程序,暂不论版本是否一致)    同类设备C1,C2(电源控制类设备) 状况:   一:      1>.设备C1+芯片A = 能够正常工作      2>. ...…

查看全部问答>

wince触摸屏

各位大侠:    要写个wince下触摸屏驱动,苦于没头绪,希望各位给点建议或资料什么的!!…

查看全部问答>

关于关于acoCE更改数据表字段的问题!

我使用的是VOADO这个类,其中包括CVOConnection和CVORecordset 当我修改记录的时候,这个类提供的函数不能用,郁闷死了。 BOOL CVORecordset::SetFieldValue(int iField, VARIANT value) {         if(!m_rs)   &nbs ...…

查看全部问答>

ADC问题

大家好,关于ADC问题请教大家:1)我要用到20通道AD,选的芯片是STM32F103ZCT6,用到ADC3、ADC1,设置如下:void ADC3_Configuration(void){    ADC_InitTypeDef ADC_InitStructure;    &n ...…

查看全部问答>

关于同步和异步通信问题

我要用F135和485异步通信又要用SPI同步和CAN总线通信在主程序里怎么设置,我感觉有冲突啊 好像同步为0,异步为1,象我这个怎么办?…

查看全部问答>

MSP430机顶盒面板控制demo

MSP430机顶盒面板控制demo…

查看全部问答>