#1楼主:[问题]ucos移植到stm32在内置ram中调试的问题
文章发表于:2008-07-04 09:05
下载的官方的移植包,去掉了probe相关的task,flash和ram配置都能编译通过,使用flash配置的调试,没有问题,led能依次点亮;但是ram配置的调试好像就跑飞了。好像进入了hard fault异常处理:
感觉是这里:
#pragma location = "INTVEC"
__root const INTVECT_ELEM AppVectTbl[] = {
{ .__ptr = __sfe("CSTACK")}, /* 0, SP start value. */
__program_start, /* 1, PC start value. */
App_NMI_ISR, /* 2, NMI */
App_Fault_ISR, /* 3, Hard Fault */
App_Spurious_ISR, /* 4, Memory Management */
App_Spurious_ISR, /* 5, Bus Fault */
App_Spurious_ISR, /* 6, Usage Fault
....
static void App_Fault_ISR (void) @ "ICODE"
{
while (1) {
;
}
}
请熟悉的同学帮忙看看,另外,这种跑飞的情况一般怎么分析,定位。
#6
文章发表于:2008-07-05 12:15
谢谢liongt关注。
大家对跑飞的问题有常用的定位方法么?
#7
文章发表于:2008-07-12 17:07
终于周末有时间玩一下板子了,看到一篇stm32 hard fault的文章,又想起了自己的这个问题(问题症状见前面帖子),于是就有调试了一下,这个过程写在下面,因为刚接触arm的东西,可能表述的有错误的地方。其实没实际应用意义,主要是想让小组的高手指点一下,让和我一样的新手学到些东西:
系统挂起时sp是0x20003C38,在disassembly窗口搜到这个地址,从上至下依次是:r0,r1,r2,r3,r12,lr,pc, pc是0x20001090,在disassembly窗口搜到这个地址,发现是在OSStartHighRdy里最后一指令B OSStartHang,把这个函数单步调试:
OSStartHighRdy
LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception priority
LDR R5, =NVIC_PENDSV_PRI
STR R5, [R4]
MOV R4, #0 ; set the PSP to 0 for initial context switch call
MSR PSP, R4
LDR R4, __OS_Running ; OSRunning = TRUE
MOV R5, #1
STRB R5, [R4]
LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception (causes context switch) NVIC_INT_CTRL 代表地址 0xe000ed04
LDR R5, =NVIC_PENDSVSET
STR R5, [R4] ;这里设置pendsv,通过disassembly窗口看结果并没有成功,0xe000ed04还是原来的值0000
CPSIE I ; enable interrupts at processor level
OSStartHang
B OSStartHang
通过disassembly窗口 查看:hard fault 寄存器地址是 0xE000ED2C 发现是0x0002,查看资料说是取向量时发生异常;用法 fault寄存器0xE000ED2A是0x0002 ,查看资料说是试图切入arm状态,cortex对这中动作,做fault处理;
有几个疑问:
1)trigger the PendSV exception 那一步不成功,不知道一般是什么原因?
2)最后那个死循环,怎么会造成hard fault呢?在PendSV Handler和Tick ISR Handler里都加了断点也没断到。

#10
文章发表于:2008-08-07 10:46
我看其他地方的帖子有这样子写的:
App_Fault_ISR B App_Fault_ISR ; 由于分配给任务的RAM不足,会引起硬件失效
给任务分配多一些RAM空间不知道会不会解决这个问题?