uC/OS-II成功移植在STM32 上了,尽管了解还不是很深入,但大体了解移植办法,从前从前将uC/OS-II移植到MSP430F1611上,可是也没重视那么多,现在依照网友的介绍进行移植,下载官方的V2.86版别的固件,自己建工程,修正Port部分,树立两个使命,可是调试时死在程序死在了OSStart();里。通过单步发现程序的软件中止触发后调用服务函数失利,停在了
OSStartHang BOSStartHang //停在这儿,而且这儿正常情况下不应该在这的;
然后就开端查问题,终究处理。发现不管学什么,一定要知其然知其所以然,不然学的永久都只是皮裘。现在把自己的移植进程和了解记录下来。
下载将官方的库,Port部分是需求修正的部分,Source部分不必修正。
(1)OS_CPU.h文件下面界说类型称号,仓库类型OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()选办法3是最合适的;界说栈增加方向,STM32是高地址向低地址增加的,所以#define OS_STK_GROWTH 1 ;
别的再界说几个函数。直接参阅移植程序,这儿不做说明晰。留意一点的是要屏蔽掉有关Systick的几个函数,OS_COU_C.c文件里的有关函数也要屏蔽,这是由于咱们在自己的程序里自己去界说咱们需求的Systick函数。
(2)OS_CPU_C.c文件界说了OSTaskStkInit()函数和一些Hook函数,OSTaskStkInit()是使命切换时分用到的,Hook函数书操作体系给用户扩展用的,由于操作体系容易不能让用户修正,故留出一些接口供用户扩展。
如上所述,屏蔽掉触及Systick的函数和一些宏界说;
(3)OS_CPU_A.asm是一些用汇编写的函数,直接复制粘贴,需求修正的当地后边详细介绍。
uC/OS-II移植时有两个重要的中止,一个是SysTick_Handler(),还一个是PendSV_Handler()。SysTick是心跳信号,SysTick 的最大使命,便是定时地产生反常恳求,作为体系的时基。OS 都需求这种“滴答”来推进使命和时刻的办理。。PendSV挂起中止操作,它的典型应用是进行使命切换,操作体系在实践运转中详细会呈现这样的问题,便是在使命切换的时分产生中止,中止有必要得到呼应,确保它的实时性,不然结果是不胜幻想的。那么在 ISR 碑文进程中,产生SysTick 反常,而且抢占了该ISR,OS 碑文必要的操作,然后pend 起PendSV 反常以作好使命切换的预备,从头回到中止,中止完成后再进行使命切换,详细参阅《Cotex-M3威望攻略》7.6节。如下图:
再介绍一下别的几个文件,在stm32f10x_it.h函数中的都是一些中止进口函数,有SysTick_Handler()、PendSV_Handler()等函数,在CMSIS发动文件中界说了这些中止的进口地址,包含SysTick_Handler()、PendSV_Handler()等,这样就对应起来了,发动文件直接能够找到进口函数。OS需求心跳时钟,所以咱们直接在程序里初始化SysTick函数,在SysTick_Handler()函数中调用OSIntEnter();OSTimeTick();OSIntExit(),这很好了解了,便是把操作体系的时钟和硬件时钟对接上了。所以也就不需求OS_CPU.h和OS_CPU_C.c中的SysTick相关的界说了。
但官方为什么要在OS_CPU.h和OS_CPU_C.c中界说OS_CPU_SysTickHandler()这个称号的函数呢?其实在stm32f10x_it.h中现已界说了SysTick_Handler()函数,这是由于官方用的是他自己的发动文件(两个文件init.s,vectors.s。init.s担任进入main(),vectors.s 设置中止向量。),他的发动文件中的进口中止地址称号OS_CPU_SysTickHandler()。同样在发动文件中他也自己界说了OS_CPU_PendSVHandler()函数,所以在OS_CPU_A.asm中界说的进口函数也是OS_CPU_PendSVHandler()。而咱们的发动文件是PendSV_Handler()。所以我前面遇到的卡死便是由于PendSV中止没找到对应的中止处理函数。所以能够修正OS_CPU_A.asm,将OS_CPU_PendSVHandle悉数替换成PendSV_Handler(),而且屏蔽掉stm32f10x_it.h中的PendSV_Handler()。另一种办法是只用修正发动文件,将PendSV_Handler()替换成OS_CPU_PendSVHandle()即可。
别的介绍两个文件,一个是OS_cfg.h和App_cfg.h,这是两个装备文件,OS_cfg.h是对OS进行装备,比方OS_T%&&&&&%KS_PER_SEC装备、OS_TIME_DLY_HMSM_EN等对用到的模块进行使能操作。App_cfg.h是用户自己按需求增加的,主要是设置使命仓库巨细,使命优先级等。
这是我移植进程中学到的,菜鸟起步,了解还不是很深,不免有误,欢迎纠正。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/264769.html