采用BOOT+APP模式。BOOT初始化SDRAM,测试SDRAM也是OK的,然后转跳APP,
APP使用内部100K+的内部ram,没有任何问题。分散加载如下
LR_IROM1 0x1A020000 0x00060000 { ; load region size_region
ER_IROM1 0x1A020000 0x00060000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x10080000 0x0000A000 {
.ANY (+RW +ZI)
}
RW_IRAM2 0x20000000 0x00010000 {
.ANY (+RW +ZI)
}
RW_IRAM3 0x10000000 0x00008000 { ; RW data
.ANY (+RW +ZI)
}
; RW_RAM1 0x28000000 0x02000000 { ; RW data
; .ANY (+RW +ZI)
; }
}
使用内部ram
这种模式下,app各种功能正常。
使用外部saram 加载如下
LR_IROM1 0x1A020000 0x00060000 { ; load region size_region
ER_IROM1 0x1A020000 0x00060000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
; RW_IRAM1 0x10080000 0x0000A000 {
; .ANY (+RW +ZI)
; }
; RW_IRAM2 0x20000000 0x00010000 {
; .ANY (+RW +ZI)
; }
; RW_IRAM3 0x10000000 0x00008000 { ; RW data
; .ANY (+RW +ZI)
; }
RW_RAM1 0x28000000 0x02000000 { ; RW data
.ANY (+RW +ZI)
}
}
外部ram
这种模式下 APP 跑流水程序(没有中断产生的)是正常的。
但是当开启各种硬件中断后程序有一定几率20%,程序会跑飞。
开始怀疑是sdram问题。就加了段测试代码
#define len123 (7*1024*1024)
unsigned int tetss= 0;
unsigned int buf[len123];
void test11(void){
unsigned int i = 0;
for(;;){
for(tetss = 0 ; tetss < len123 ; tetss++)
buf[tetss] = tetss + i;
tetss = 0;
while(1){
if((tetss%1000000 == 0)||(buf[tetss] != (tetss + i)))
jhprintf("mcu staring %d , %d\n" ,i , buf[tetss]);
tetss++;
if(tetss >= len123)
break;
}
i++;
}
}
这个测试非常正常。
怀疑是中断向量地址没有设置好。跑测试了下也是正常的。(使用内部ram和外部ram的向量地址是一样的)
SCB->VTOR 的值也是 0x1A020000 |