有个人说的很对,sct就是要多写、多试才能出经验。
文件1就可以:
做法:同一集合的obj文件另起加载域存放。
好处:加载域首地址可以不接在上一个加载域的结尾。
------------------------------------ file1 -----------------------------------------------------------------------------
LR_IROM1 0x08000000 0x00034000 { ; load region size_region all=0x00040000 Size: 0x000079b0
ER_IROM1 0x08000000 0x00034000 { ; load address = execution address
*.o (RESET, +First)
* (+RO)
}
RW_IRAM1 0x20000000 0x0000C000 { ; RW data
* (+RW +ZI)
}
}
LR_IROM_FS 0x08034000 0x00003000 { ; Size: 0x00002d5c(include RW data)
ER_IROM_FS 0x08034000 0x00003000 {
ff.o (+RO) ;under FS
fattime.o (+RO)
ccsbcs.o (+RO)
}
}
LR_IROM_OS_CORE 0x08037000 0x00004000 { ; Size: 0x00002ec0
ER_IROM_OS_CORE 0x08037000 0x00004000 {
os_core.o (+RO) ;under OS_CORE
os_flag.o (+RO)
os_mem.o (+RO)
os_q.o (+RO)
os_sem.o (+RO)
os_task.o (+RO)
os_time.o (+RO)
}
}
LR_IROM_OS_PORTS 0x0803B000 0x00001000 { ; Size: 0x000002d8
ER_IROM_OS_PORTS 0x0803B000 0x00001000 {
os_cpu_c.o (+RO) ;under OS_PORTS
os_dbg.o (+RO)
}
}
file2就不行:
做法:同一集合的obj文件另起运行域存放。
现象:运行时进hardfault
-------------------------------------- file2 ---------------------------------------------------------------------------
LR_IROM1 0x08000000 0x00040000 { ; load region size_region all=0x00040000 Size: 0x000079b0
ER_IROM1 0x08000000 0x00030000 { ; load address = execution address
*.o (RESET, +First)
* (+RO)
}
ER_IROM_FS 0x08030000 0x00003000 {
ff.o (+RO) ;under FS
fattime.o (+RO)
ccsbcs.o (+RO)
}
ER_IROM_OS_CORE 0x08033000 0x00004000 {
os_core.o (+RO) ;under OS_CORE
os_flag.o (+RO)
os_mem.o (+RO)
os_q.o (+RO)
os_sem.o (+RO)
os_task.o (+RO)
os_time.o (+RO)
}
ER_IROM_OS_PORTS 0x08037000 { ;0x00001000
os_cpu_c.o (+RO) ;under OS_PORTS
os_dbg.o (+RO)
}
RW_IRAM1 0x20000000 0x0000C000 { ; RW data
* (+RW +ZI)
}
}
结合图1来看分析,我猜(错了别怪我,不过应该没错,哈哈):在一个加载域里,多个运行域只能代表不同的段,包括RO、RW、ZI、NOINIT。如果两个运行域里的段的属性都是RO,那么运行域就没有起到合并同属性的段的目的,所以就hardfault了。比如file2里,前几个运行域里的段的属性都是RO,所以就错了。