主题: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 有关、但我不知道。 感谢您提供任何帮助。