器件型号:SAFETI_DIAG_LIB
大家好!
我将使用具有 SAFeTI 诊断库并集成 RTOS 的 TMS570LC43 MCU。
我面临的一个问题是没有给 HIGHANDLER 内存分配。 并且"uint32 size=(Uint32)&ulHighHandlerSize;"的值 始终为0。 系统进入 SWRST 模式。
我在映射文件中看到它没有为".sl_stflash_SRAM"分配任何存储器。
我在下面共享链接器代码。
- -retain="*(.intvecs)"
--entry_point=_c_int00
/*------------------ */
/*内存映射*/
内存
{
/*这些配置设置对于所有基于 SAFERTOS 的
*应用程序。
*如果整个构建使用 ARM 模式、则向量长度可以为0x20。
*在使用 Thumb 模式时,需要0x80以适应交互工作
*代码。 */
VECTORS (X):origin=0x00000000 length=0x00000080 vfill = 0xffffffff
KERN_FUNC (RX):origin=0x00000080 length=0x0000ff80 vfill = 0xffffffff
FLASH0 (RX):origin=0x00010000 length=0x001F0000 vfill = 0xffffffff
FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
堆栈(RW):origin=0x08000000 length=0x00003800
KERN_DATA (RW):origin=0x08003800 length=0x00001800
RAM (RW):origin=0x08005000 length=0x00070000
high_handler (rwx):origin=0x8075000 length=0x000800
Profile (rw): origin=0x8075800 length=0x00006000 //添加以进行分析
log (RW): origin=0x807B800 length=0x00003800 fill=0xDEADBEEF //添加以进行记录
FEE (R):origin=0xF0200000 length=0x00000064 fill=0xDEADBEEF //对于 FEE 测试,仅对样例应用程序有效
}
/*------------------ */
/*段配置*/
部分
{
/*这些配置设置对于所有基于 SAFERTOS 的
*应用程序。 */
/*需要导出以下符号:
*
* lnkKernelFuncStartAddr -运行时使用的闪存存储器部分的开始部分。
*
*重要说明: lnkKernelFuncStartAddr 可以重新定位(例如,当
*使用了 bootloader)、但必须根据其大小对齐它
*(四舍五入到下一个2的幂)、否则 MPU 将为
*配置不正确。
*
* lnkEndFlashAddress -运行时使用的 Flash 存储器段的末尾。
*
* lnkKernelFuncStartAddr -包含 ARM Cortex-M4内核的 Flash 块的起始地址、
*中断矢量表和内核函数。
*注意:这应该根据段大小对齐,即0x8000。
*
* lnkKernelFuncEndAddr -包含 ARM Cortex-M4内核的 Flash 块的结束地址、
*中断矢量表和内核函数。
*
* lnkKernelDataStartAddr -包含 ARM Cortex-M4内核的 RAM 块的起始地址、
*系统堆栈和内核数据。
*
* lnkKernelDataEndAddr -包含 XML 核心文件的 RAM 块的结束地址、
*系统堆栈和内核数据。
*/
/*在此演示应用中,内核函数部分位于
* Flash 存储器启动;如果应用程序被重定位,则不会出现这种情况。 */
.intvecs palign (32)、start (lnkStartFlashAddress)、start (lnkKernelFuncStartAddr)
fill =0xffffffff{}>向量
.sl_stflash_SRAM:run = high_handler、load = FLASH0|FLASH1、load_start (ulHighHandlerLoadStart)、load_end (ulHighHandlerLoadEnd)、
Load_Size (ulHighHandlerSize)、RUN_START (ulHighHandlerStartAddr)、RUN_END (ulHighHandlerEndAddr)
.kernel_function end( lnkKernelFuncEndAddr ):
{
*(内核函数)
}> KERN_FUNC
unpriv_flash palign (32),end( lnkEndFlashAddress ):
{
*(.text)
*(.const)
}> FLASH0 | FLASH1
.cinit align (32):{}> FLASH0 | FLASH1
.pinit align (32):{}> FLASH0 | FLASH1
stack_data start( lnkKernelDataStartAddr ):{}> stacks
kernel_data end( lnkKernelDataEndAddr ):{}> kern_data
.bss :{}> RAM
.data :{}> RAM
.sysmem:{}> RAM
.stack_data_Svc:{. += 1024;}>栈、RUN_START (StackModeSVC)
.stack_data_fiq:{。 += 1024;}>栈、RUN_START (StackModeFIQ)
.stack_data_IRQ:{。 += 1024;}>栈、RUN_START (StackModeIRQ)
.stack_data_abt:{. += 1024;}>栈、RUN_START (StackModeABT)
.stack_data_und:{。 += 1024;}>栈、RUN_START (StackModeUND)
.stack_data_sys:{。 += 1024;}>栈、RUN_START (StackModeSYS)
log_data : start( ulLOGStartAddr ), end( ulLOGEndAddr )> log
Profile_data : start( ulPROFILEStartAddr ), end( ulPROFILEEndAddr )>个人资料
/*这些配置设置适用于 SafeRTOS TMS570LC43x FPU 演示
*项目。 其中包含了这些示例、用于演示如何使用
*被分组到已知的位置,从而使 MPU 区域能够
*可以定义。 */
__idle_hook_data__
: start( lnkIdleTaskDataStartAddr )
{}> RAM palign ( 0x20)
}
下面是映射文件图像。
存储器配置
名称源长度已使用未使用属性填充
---------------- ---------------- ---------------- ---------------- ---------------- ----------------
向量00000000 00000080 00000020 00000060 X (ffffffff)
KERN_FUNC 00000080 0000ff80 0000864c 00007934 R X (ffffffff)
FLASH0 00010000 001f0000 00025090 001caf70 R X (ffffffff)
FLASH1 00200000 00200000 00200000 00000000 00200000 R X (ffffffff)
堆栈08000000 00001800 00001800 00000000 RW
KERN_DATA 08001800 00000800 00000504 000002fc RW
RAM 08004000 00019000 00005630 000139d0 RW
high_handler 08075000 00000800 00000000 00000800 RW X <-未从 sl_stflash_sram 获取内存
配置文件08075800 00006000 00003e78 00002188 RW
Log 0807b800 00003800 00003800 00000000 RW 死牛肉
FEE f0200000 00000064 00000064 00000000 R DEADBE牛肉
分段分配映射
运行原点 load origin length init length attrs 成员
---------------- ---------------- ---------------- ---------------- -------- ----------------
00000000 00000000 00000020 00000020 r-x
00000000 00000000 00000020 00000020 r-x .intvecs
00000080 00000080 0000864c 0000864c r-x
00000080 00000080 0000864c 0000864c r-x .kernel_function
00010000 00010000 00025090 00025090 r-x
00010000 00010000 00025000 00025000 00025000 r-x .unpriv_flash
00035000 00035000 00000090 00000090 r--.cinit
08000000 08000000 00001800 00000000 r--
08000000 08000000 00000400 00000000 r--.stack_data_abt
08000400 08000400 00000400 00000000 r-.STACK_DATA_FIQ
08000800 08000800 00000400 00000000 r-.STACK_DATA_IRQ
08000c00 08000c00 00000400 00000000 r-.STACK_DATA_Svc
08001000 08001000 00000400 00000000 r-.STACK_DATA_sys
08001400 08001400 00000400 00000000 r-.stack_data_und
08001800 08001800 00000504 00000000 RW
08001800 08001800 00000504 00000000 rw- kernel_data
08004000 08004000 00005610 00000000 RW
08004000 08004000 000054e8 00000000 RW-.data
080094e8 080094e8 00000128 00000000 RW-.bss
08009620 08009620 00000020 00000000 RW-
08009620 08009620 00000020 00000000 RW -_IDLE_HOOK_DATA__
08075800 08075800 00003e78 00000000 RW-
08075800 08075800 00003e78 00000000 rw- PROFILE_DATA
0807b800 0807b800 00003800 00003800 r-
0807b800 0807b800 00003800 00003800 r--$fill000
f0200000 f0200000 00000064 00000064 r-
f0200000 f0200000 00000064 00000064 r-$fill001
您能告诉我为什么没有为 high_handler 或".sl_stflash_SRAM"获得内存分配?
因此、不执行以下代码部分、系统进入复位模式。
uint32 i;/*TODO*/
uint32 size=(uint32)&ulHighHandlerSize;/*待办事项*/
for (I=0;I)
{
((char *)&ulHighHandlerStartAddr)[i]=((char *)&ulHighHandlerLoadStart)[i];/* Todo*/
}
我们在 sl_selftest.c 中还有 pragma
#ifdef __TI_Compiler_version__
#pragma CODE_SECTION (sl_SelfTest_Flash、".sl_stflash_SRAM")
#endif