这段代码定义了一个名为 `THREAD_Create` 的函数,主要用于创建一个新的线程。以下是对代码的逐行解释: ```c ThreadId THREAD_Create(Runnable run, void *argv, const ThreadAttr *attr) ``` - 函数签名,返回类型为 `ThreadId`,意味着该函数将返回新线程的 ID。 - `run` 是一个可执行的 Runnable 函数。 - `argv` 是传递给函数的参数。 - `attr` 是一个指向线程属性的结构体,包含线程的各种配置。 ```c osThreadAttr_t taskAttr = {attr->name, 0, NULL, 0, NULL, attr->stackSize, (osPriority_t)(attr->priority), 0, 0}; ``` - 初始化一个 `osThreadAttr_t` 类型的结构体 `taskAttr`,来存储线程的属性,包括线程名、堆栈大小和优先级等。 ```c taskAttr.stack_mem = memalign(16, attr->stackSize); ``` - 使用 `memalign` 函数为线程分配对齐的堆栈内存,确保符合16字节对齐要求。 ```c return (ThreadId)osThreadNew((osThreadFunc_t)run, argv, &taskAttr); ``` - 调用 `osThreadNew` 函数,创建新线程,并传入运行函数、参数和线程属性。 - 最后返回新线程的 ID。 这段代码是一个链接脚本片段,用于定义在支持 PSRAM (伪静态随机存取存储器)情况下的数据和 BSS 段的布局。以下是对每个部分的详细解释: ### `.psram_data` 段 ```c .psram_data : { __psram_data_start = .; // 定义数据段的起始位置 __psram_data_load = LOADADDR(.psram_data); // 数据加载地址 . = ALIGN(8); // 地址对齐到8字节 SORT(*libposix*.a:*.o*) (.data .data* .sdata .sdata*); // 依次排序不同库的 .data 段 ... . = ALIGN(8); // 重新对齐 __psram_data_end = .; // 定义数据段的结束位置 } > PSRAM_APP_DATA AT > FLASH_PROGRAM __psram_data_size = __psram_data_end - __psram_data_start; // 计算数据段大小 ``` - `SORT` 指令会将指定对象文件中的数据段按特定顺序排序,以便在生成的可执行文件中保证数据的组织。 - `ALIGN(8)` 确保段的起始地址是8字节对齐的,符合某些架构的对齐要求。 - `> PSRAM_APP_DATA AT > FLASH_PROGRAM` 指示该段应该放置在 PSRAM 中,并且在程序闪存中存在程序的加载地址。 - `__psram_data_size` 变量用于存储数据段的大小。 ### `.psram_bss` 段 ```c .psram_bss (NOLOAD): { __psram_bss_start = .; // 定义 BSS 段的起始位置 __psram_bss_load = LOADADDR(.psram_bss); // BSS 段的加载地址 . = ALIGN(8); // 地址对齐到8字节 SORT(*libposix*.a:*.o*) (.bss .bss* .sbss .sbss* COMMON); // 依次排序不同库的 .bss 段 ... . = ALIGN(8); // 重新对齐 __psram_bss_end = .; // 定义 BSS 段的结束位置 } > PSRAM_APP_DATA __psram_bss_size = __psram_bss_end - __psram_bss_start; // 计算 BSS 段大小 ``` - `NOLOAD` 表示该段在程序运行时不需要初始化,可以在内存中留出空间,但不需要为它分配实际的加载地址。 - BSS 段用于未初始化的全局和静态变量,其大小在链接时确定。 在psram中内存中申请线程步骤如下: 一、参照以下图片进行配置 主要申请psram内存的代码是: 二、对drivers\boards\brandy_evb\linker\standard\acore.prelds目录下的链接脚本进行配置 具体配置参考如下配置 1、SORT(*xts_test*.a:*.o*) (.data .data* .sdata .sdata*) 在101行后新增一行将xts_test修改为要编译的编译对象 2、SORT(*xts_test*.a:*.o*) (.bss .bss* .sbss .sbss* COMMON) 在125行后新增一行将xts_test修改为要编译的编译对象 3、编译的编译对象为output目录下根据编译过程后线程所在路径下产生的.a文件,例如: 4、检验成功标准:通过AT指令:AT^HEAPINFO/AT^STACKINFO查看修改的线程,如果prio_status的地址为0x6**则线程成功切换到psram,如果为0x2**则为DTCM。 注意:Malloc()申请的是psram的内存;osal_kmalloc()申请的是sram(DTCM)的内存。 图片显示不了,在附件附上文件
|