求教UCOS 移植stm32f103 ucosVE编译时出现的错误

本帖子已过去太久远了,不再提供回复功能。查看: 3952|回复: 1
移植ucosii遇到的问题 B OSStartHang
ucosii在STM32rbt6上可以正常地运行,工作需要,我将ucosii移植到STM32F103C8T6,更换了一下启动代码,结果程序 开始调度时就死在那了 OSStart(); 进去后
void&&OSStart (void)
& & if (OSRunning == OS_FALSE) {
& && &&&OS_SchedNew();& && && && && && && && && && &
& && &&&OSPrioCur& &&&= OSPrioHighR
& && &&&OSTCBHighRdy&&= OSTCBPrioTbl[OSPrioHighRdy];
& && &&&OSTCBCur& && &= OSTCBHighR
& && &&&OSStartHighRdy();& && && && && && && && && &
}停在黑色加粗,通过调试找到汇编代码.asm里边
OSStartHang
& & B& && & OSStartHang 这个位置。
网上搜索后有网友提供答案
关于STM32F107VC _OSStartHang解决方案
问题:移植UCOS-II后,程序总是在
B& && && &OSStartHang ,//根据提示,应当永远不会到这步的。
其实很简单,因为STM32本身的异常中断PendSV_Handler替代了UCOS的异常中断OSPendSV,使其不能正常执行。这样我们就需要更改PendSV_Handler为OSPendSV以让中断正常。
更改startup_stm32f10x_cl.s(V3.5.版本)
1、DCD& &&&PendSV_Handler& && && && &; PendSV Handler
DCD& &&&OSPendSV& && && && && &&&; OSPendSV 中断
2、PendSV_Handler& & PROC
EXPORT&&PendSV_Handler& && && && & [WEAK]
OSPendSV& && &&&PROC
EXPORT&&OSPendSV& && && && && && & [WEAK]
第二种:&&—startup_stm32f10x_cl.s中定义了中断向量表(中断函数的入口地址)
—stm32f10x_it.c 中断服务函数的C语言代码。
在startup_stm32f10x_cl.s中有两段代码如下:
DCD& &&&PendSV_Handler
DCD& &&&SysTick_Handler
在stm32f10x_it.c中的服务函数如下
void PendSV_Handler(void)
void SysTick_Handler(void)
1:ucos系统中断函数更名为PendSV_Handler,注释掉stm32f10x_it.c文件中void PendSV_Handler(void)函数。
2:在void SysTick_Handler(void)函数中添加如下代码:
void SysTick_Handler(void)
OS_CPU_SR&&cpu_
OS_ENTER_CRITICAL(); // Tell uC/OS-II that we are starting an ISR
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();& && && & // Call uC/OS-II’s OSTimeTick()
OSIntExit();& && && && &// Tell uC/OS-II that we are leaving the ISR
================================================
之前一直使用的stm32f10x_it.c中的PendSV_Handler函数里调用OSPendSV()的方式突然不好用了,可能和升级了IAR6有关系,之前一直使用的是IAR5.4。
参照上述操作,已经好用了,有些差别用的startup_stm32f10x_cl.s V3.1.2版本。
DCD& &&&OSPendSV& && && && &; PendSV Handler
PUBWEAK OSPendSV
& && &&&SECTION .text:CODE:REORDER(1)
& && &&&B OSPendSV
 学习,学习!!!!!!!!
Powered byuCOS Ⅲ(1)
笔者在移植uCOS Ⅲ到stm32f103c8时碰到如下问题
Error: L6407W: Sections of aggregate size 0x6c48 bytes could not fit into .ANY selector(s).初步推定应该是内核服务没有配置导致,在别人提示下查看了以前stm32f103vet6移植编译成功的ucos Ⅲ工程MAP文件。
考虑到stm32f103c8不用这么多服务,因此拟对内核服务做出裁剪。
事后验证,事实上不用删除uCOS-III\Source下对应服务的C语言文件,只需找到os_cfg.h文件,对其中不用的服务进行置0操作,MEMORY MANAGEMENT 占用内存较多,而且f103c8不需要内存管理,首先可将其服务置零,然后编译发现已经可以编译通过,代码量差不多是27KB左右,后又对其他不用服务进行了相同操作。最终可将代码量控制在8k左右。
os_cfg.h文件最终配置如下所示
#define OS_CFG_APP_HOOKS_EN & & & & & & 0u & /* Enable (1) or Disable (0) application specific hooks & & & & & & & & &*/
#define OS_CFG_ARG_CHK_EN & & & & & & & 1u & /* Enable (1) or Disable (0) argument checking & & & & & & & & & & & & & */
#define OS_CFG_CALLED_FROM_ISR_CHK_EN & 1u & /* Enable (1) or Disable (0) check for called from ISR & & & & & & & & & */
#define OS_CFG_DBG_EN & & & & & & & & & 1u & /* Enable (1) debug code/variables & & & & & & & & & & & & & & & & & & & */
#define OS_CFG_ISR_POST_DEFERRED_EN & & 1u & /* Enable (1) or Disable (0) Deferred ISR posts & & & & & & & & & & & & &*/
#define OS_CFG_OBJ_TYPE_CHK_EN & & & & &1u & /* Enable (1) or Disable (0) object type checking & & & & & & & & & & & &*/
#define OS_CFG_TS_EN & & & & & & & & & &0u & /* Enable (1) or Disable (0) time stamping & & & & & & & & & & & & & & & */
#define OS_CFG_PEND_MULTI_EN & & & & & &1u & /* Enable (1) or Disable (0) code generation for multi-pend feature & & &*/
#define OS_CFG_PRIO_MAX & & & & & & & &32u & /* Defines the maximum number of task priorities (see OS_PRIO data type) */
#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN &0u & /* Include code to measure scheduler lock time & & & & & & & & & & & & & */
#define OS_CFG_SCHED_ROUND_ROBIN_EN & & 0u & /* Include code for Round-Robin scheduling & & & & & & & & & & & & & & & */
#define OS_CFG_STK_SIZE_MIN & & & & & &64u & /* Minimum allowable task stack size & & & & & & & & & & & & & & & & & & */
& & & & & & & & & & & & & & & & & & & & & & &/* ----------------------------- EVENT FLAGS --------------------------- */
#define OS_CFG_FLAG_EN & & & & & & & & &0u & /* Enable (1) or Disable (0) code generation for EVENT FLAGS & & & & & & */
#define OS_CFG_FLAG_DEL_EN & & & & & & &0u & /* & & Include code for OSFlagDel() & & & & & & & & & & & & & & & & & & &*/
#define OS_CFG_FLAG_MODE_CLR_EN & & & & 0u & /* & & Include code for Wait on Clear EVENT FLAGS & & & & & & & & & & & &*/
#define OS_CFG_FLAG_PEND_ABORT_EN & & & 0u & /* & & Include code for OSFlagPendAbort() & & & & & & & & & & & & & & & &*/
& & & & & & & & & & & & & & & & & & & & & & &/* -------------------------- MEMORY MANAGEMENT ------------------------ */
#define OS_CFG_MEM_EN & & & & & & & & & 0u & /* Enable (1) or Disable (0) code generation for MEMORY MANAGER & & & & &*/
& & & & & & & & & & & & & & & & & & & & & & &/* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */
#define OS_CFG_MUTEX_EN & & & & & & & & 0u & /* Enable (1) or Disable (0) code generation for MUTEX & & & & & & & & & */
#define OS_CFG_MUTEX_DEL_EN & & & & & & 0u & /* & & Include code for OSMutexDel() & & & & & & & & & & & & & & & & & & */
#define OS_CFG_MUTEX_PEND_ABORT_EN & & &0u & /* & & Include code for OSMutexPendAbort() & & & & & & & & & & & & & & & */
& & & & & & & & & & & & & & & & & & & & & & &/* --------------------------- MESSAGE QUEUES -------------------------- */
#define OS_CFG_Q_EN & & & & & & & & & & 0u & /* Enable (1) or Disable (0) code generation for QUEUES & & & & & & & & &*/
#define OS_CFG_Q_DEL_EN & & & & & & & & 0u & /* & & Include code for OSQDel() & & & & & & & & & & & & & & & & & & & & */
#define OS_CFG_Q_FLUSH_EN & & & & & & & 0u & /* & & Include code for OSQFlush() & & & & & & & & & & & & & & & & & & & */
#define OS_CFG_Q_PEND_ABORT_EN & & & & &0u & /* & & Include code for OSQPendAbort() & & & & & & & & & & & & & & & & & */
& & & & & & & & & & & & & & & & & & & & & & &/* ----------------------------- SEMAPHORES ---------------------------- */
#define OS_CFG_SEM_EN & & & & & & & & & 1u & /* Enable (1) or Disable (0) code generation for SEMAPHORES & & & & & & &*/
#define OS_CFG_SEM_DEL_EN & & & & & & & 1u & /* & &Include code for OSSemDel() & & & & & & & & & & & & & & & & & & & &*/
#define OS_CFG_SEM_PEND_ABORT_EN & & & &1u & /* & &Include code for OSSemPendAbort() & & & & & & & & & & & & & & & & &*/
#define OS_CFG_SEM_SET_EN & & & & & & & 1u & /* & &Include code for OSSemSet() & & & & & & & & & & & & & & & & & & & &*/
& & & & & & & & & & & & & & & & & & & & & & &/* -------------------------- TASK MANAGEMENT -------------------------- */
#define OS_CFG_STAT_TASK_EN & & & & & & 0u & /* Enable (1) or Disable(0) the statistics task & & & & & & & & & & & & &*/
#define OS_CFG_STAT_TASK_STK_CHK_EN & & 0u & /* Check task stacks from statistic task & & & & & & & & & & & & & & & & */
#define OS_CFG_TASK_CHANGE_PRIO_EN & & &0u & /* Include code for OSTaskChangePrio() & & & & & & & & & & & & & & & & & */
#define OS_CFG_TASK_DEL_EN & & & & & & &0u & /* Include code for OSTaskDel() & & & & & & & & & & & & & & & & & & & & &*/
#define OS_CFG_TASK_Q_EN & & & & & & & &0u & /* Include code for OSTaskQXXXX() & & & & & & & & & & & & & & & & & & & &*/
#define OS_CFG_TASK_Q_PEND_ABORT_EN & & 0u & /* Include code for OSTaskQPendAbort() & & & & & & & & & & & & & & & & & */
#define OS_CFG_TASK_PROFILE_EN & & & & &1u & /* Include variables in OS_TCB for profiling & & & & & & & & & & & & & & */
#define OS_CFG_TASK_REG_TBL_SIZE & & & &1u & /* Number of task specific registers & & & & & & & & & & & & & & & & & & */
#define OS_CFG_TASK_SEM_PEND_ABORT_EN & 0u & /* Include code for OSTaskSemPendAbort() & & & & & & & & & & & & & & & & */
#define OS_CFG_TASK_SUSPEND_EN & & & & &1u & /* Include code for OSTaskSuspend() and OSTaskResume() & & & & & & & & & */
& & & & & & & & & & & & & & & & & & & & & & &/* -------------------------- TIME MANAGEMENT -------------------------- */
#define OS_CFG_TIME_DLY_HMSM_EN & & & & 1u & /* & & Include code for OSTimeDlyHMSM() & & & & & & & & & & & & & & & & &*/
#define OS_CFG_TIME_DLY_RESUME_EN & & & 1u & /* & & Include code for OSTimeDlyResume() & & & & & & & & & & & & & & & &*/
& & & & & & & & & & & & & & & & & & & & & & &/* ------------------------- TIMER MANAGEMENT -------------------------- */
#define OS_CFG_TMR_EN & & & & & & & & & 0u & /* Enable (1) or Disable (0) code generation for TIMERS & & & & & & & & &*/
#define OS_CFG_TMR_DEL_EN & & & & & & & 0u & /* Enable (1) or Disable (0) code generation for OSTmrDel() & & & & & & &*/
代码编译后规模如下
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7371次
排名:千里之外
原创:31篇
(2)(2)(9)(3)(3)(1)(1)(2)(2)(2)(2)(1)(4)(1)查看: 127|回复: 1
编译出现错误 怎么回事
主题帖子精华
新手上路, 积分 38, 距离下一级还需 12 积分
在线时间3 小时
1111.jpg (83.98 KB, 下载次数: 0)
21:45 上传
& &exti.c 文件中用过有这两个代码
QQ截图10.jpg (30.39 KB, 下载次数: 0)
21:47 上传
QQ截图23.jpg (10.68 KB, 下载次数: 0)
21:47 上传
我对照和资料代码一样 为啥出现这样的错误呢 ?帮忙解决一下 困扰了好几天了 谢谢
主题帖子精华
在线时间449 小时
库函数没添加进来,你直接编译我们例程试试
Powered by}

我要回帖

更多关于 ucosiii移植stm32f103 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信