历史上的今天
今天是: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 */
史海拾趣
|
近日,艾克赛尔(Axelwave)无线网络成功将自己的高品质无线网络设备应用到隧道宽带传输应用当中,建立了一条带宽最高可达近30Mbps的直接从隧道内到隧道外的无线传输链路。为隧道内中长距离,高带宽的无线应用开辟了新的天地。 这条隧道位于陕西省 ...… 查看全部问答> |
|
有没有那位大虾把2440的EBOOT移植到2410的板上过,我搞了一天都没搞好,哎,应该改的都改了,就是不能运行,奇怪哉! 请各位高手说说自己的想法,小弟不剩感激. 之所以有这个想法是因为2410的EBOOT差得要死,无BOOTPART部分,如果在2410的EBOOT上增 ...… 查看全部问答> |
|
我使用的是VOADO这个类,其中包括CVOConnection和CVORecordset 当我修改记录的时候,这个类提供的函数不能用,郁闷死了。 BOOL CVORecordset::SetFieldValue(int iField, VARIANT value) { if(!m_rs) &nbs ...… 查看全部问答> |




