主题:SysConfig 中讨论的其他器件
工具/软件:
您好:
我利用 tisp 在 c7x 上开发了一个基本的裸机应用程序来测试硬件并开发我们的算法。 这一直可以正常工作、但现在我需要使用 Linux 主机实现 IPC、并且似乎需要 FreeRTOS、尽管我更倾向于使用裸机模式。 (NoRTOS 缺少库)
要迁移到 RTOS、我要做的第一步是加入库、由于入口点的原因、这要求我更改链接器文件以包含 MMU 和 BSS 的一些内容。 我使用示例中的参考。 FreeRTOS 入口点似乎与 SysConfig 生成的 ti_DPL_config.c 中的 MMU 配置有一定的依赖关系。 我也包含该文件
随着这些更改的实施、我的项目再次构建、主函数像以前一样运行、但 TISP (特别是 DRU 的使用)被破坏。 检查传输完成的循环现在会一直挂起。
特别是、DmaUtilsAutoInc3d_wait ()的这一行将永久挂起:
while ((eflRegisterVal & waitWord)!= waitWord){
我的 main 函数没有任何变化-唯一的变化是添加了 FreeRTOS 库、调整入口点、以及相关链接器的更改。 作为参考、以下是我的旧链接器文件:
-heap 0xF0000 // 756 kB
-stack 0x4000 // 16 kB
--cinit_compression=off
--args 0x1000
--diag_suppress=10068 // "no matching section"
MEMORY
{
L2SRAM_CINIT (RWX) : org = 0x7E000000, len = 0x000100 //for 256byte init c7x_0 = 7E000000, c7x_1 = 7E200000
L2SRAM (RWX) : org = 0x7E000100, len = 0x1fff00 //for 2MBytes EL2
L2SRAMAUX (RWX): org = 0x7F000000, len = 0x040000 // for 256 KBytes J7AEN c7x_0 = 7F000000, c7x_1 = 7F800000
EXTMEM_STATIC (RWX): org = 0x80000000, len = 0x4000000
EXTMEM (RWX): org = 0x84000000, len = 0x200000
}
SECTIONS
{
.sram_start START(_sram_start) > L2SRAM NOINIT
// .kernel: {
// *.obj (.text:optimized) { SIZE(_kernel_size) }
// } > EXTMEM
// .kernel_data SIZE(_data_size)
.l2mem > L2SRAM
.l1dmemory > L2SRAM
.l2dmemory > L2SRAM
.text: > L2SRAM
.text:touch: > L2SRAM
.text:_c_int00: > L2SRAM_CINIT
.neardata: > L2SRAM
.rodata: > L2SRAM
.bss: > L2SRAM
.init_array: > L2SRAM
.far: > L2SRAM
.fardata: > L2SRAM
.neardata > L2SRAM
.rodata > L2SRAM
.data: > L2SRAM
.switch: > L2SRAM
.args: > L2SRAM align = 0x4, fill = 0 {_argsize = 0x200; }
.sysmem: > L2SRAM
.cinit: > EXTMEM
.const: > L2SRAM START(const_start) SIZE(const_size)
.pinit: > L2SRAM
.cio: > L2SRAM
.stack: > L2SRAM
.ddrData > EXTMEM_STATIC
.staticData > EXTMEM_STATIC
.l2sramaux > L2SRAMAUX
xdc.meta: > L2SRAM, type = COPY
}
这是新的链接器文件。 这基本上是直接从一个例子,但我扩大了堆,并将大多数本地程序数据移动到 SRAM
--ram_model
-heap 0x20000
-stack 0x20000
--args 0x1000
--diag_suppress=10068 /* to suppress no matching section error */
--cinit_compression=off
-e _c_int00_secure
#define DDR0_ALLOCATED_START 0xA3000000
#define C7X_ALLOCATED_START DDR0_ALLOCATED_START
#define C7X_RESOURCE_TABLE_BASE (C7X_ALLOCATED_START + 0x00100000)
#define C7X_IPC_TRACE_BUFFER (C7X_ALLOCATED_START + 0x00100400)
#define C7X_BOOT_BASE (C7X_ALLOCATED_START + 0x00200000)
#define C7X_VECTOR_BASE (C7X_ALLOCATED_START + 0x00400000)
#define C7X_DDR_SPACE_BASE (C7X_ALLOCATED_START + 0x00410000)
MEMORY
{
L2SRAM (RWX): org = 0x7E000000, len = 0x200000
DDR0_RESERVED: org = 0x80000000, len = 0x19800000 /* Reserved for A53 OS */
C7X_IPC_D: org = C7X_ALLOCATED_START, len = 0x00100000 /* 1MB DDR */
C7X_BOOT_D: org = C7X_BOOT_BASE, len = 0x400 /* 1024B DDR */
C7X_VECS_D: org = C7X_VECTOR_BASE, len = 0x4000 /* 16KB DDR */
C7X_CIO_MEM: org = C7X_DDR_SPACE_BASE, len = 0x1000 /* 4KB */
C7X_DDR_SPACE: org = C7X_DDR_SPACE_BASE+0x1000, len = 0x00BF0000-0x1000 /* 11.9MB - 4KB DDR */
/* For resource table */
C7X_RT_D: org = C7X_RESOURCE_TABLE_BASE, len = 0x400 /* 1024B DDR */
/* IPC trace buffer */
LINUX_IPC_TRACE_BUFFER: org = C7X_IPC_TRACE_BUFFER, len = 0xFFC00 /* 1023KB DDR */
LOG_SHM_MEM : ORIGIN = 0xA7000000, LENGTH = 0x40000
/* Shared memory for RTOS NORTOS IPC */
RTOS_NORTOS_IPC_SHM_MEM: org = 0xA5000000, len = 0x1C00000 /* 8MB DDR */
}
SECTIONS
{
boot:
{
boot.*<boot.oe71>(.text)
} load > C7X_BOOT_D
.vecs > C7X_VECS_D
.secure_vecs > C7X_DDR_SPACE ALIGN(0x100000)
.text:_c_int00_secure > C7X_DDR_SPACE ALIGN(0x200000)
.text > C7X_DDR_SPACE ALIGN(0x100000)
.bss > L2SRAM /* Zero-initialized data */
RUN_START(__BSS_START)
RUN_END(__BSS_END)
.l2mem > L2SRAM
.ddrData > C7X_DDR_SPACE
.data > L2SRAM /* Initialized data */
.cinit > L2SRAM /* could be part of const */
.init_array > L2SRAM /* C++ initializations */
.stack > L2SRAM ALIGN(0x2000)
.args > L2SRAM
.cio > C7X_CIO_MEM
.const > L2SRAM
.switch > L2SRAM /* For exception handling. */
.sysmem > L2SRAM /* heap */
GROUP: > C7X_DDR_SPACE
{
.data.Mmu_tableArray : type=NOINIT
.data.Mmu_tableArraySlot : type=NOINIT
.data.Mmu_level1Table : type=NOINIT
.data.gMmu_tableArray_NS : type=NOINIT
.data.Mmu_tableArraySlot_NS : type=NOINIT
.data.Mmu_level1Table_NS : type=NOINIT
}
.benchmark_buffer: > C7X_DDR_SPACE ALIGN (32)
/* This is the resource table used by linux to know where the IPC "VRINGs" are located */
.resource_table: { __RESOURCE_TABLE = .;} > C7X_RT_D
/* This IPC log can be viewed via ROV in CCS and when linux is enabled, this log can also be viewed via linux debugfs */
.bss.debug_mem_trace_buf : {} palign(128) > LINUX_IPC_TRACE_BUFFER
/* this is used when Debug log's to shared memory is enabled, else this is not used */
.bss.log_shared_mem (NOLOAD) : {} > LOG_SHM_MEM
/* this is used only when IPC RPMessage is enabled */
.bss.ipc_vring_mem (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM
}
我唯一猜的是、这可能与 MMU 有关、但我不知道。 感谢您提供任何帮助。