找回密码
 立即注册
搜索
热搜: 星闪 最新 活动
查看: 306|回复: 0

线程申请psram内存

[复制链接]

33

主题

2

回帖

145

积分

注册会员

积分
145
发表于 2024-9-4 17:28:54 | 显示全部楼层 |阅读模式

这段代码定义了一个名为 `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目录下的链接脚本进行配置
具体配置参考如下配置
1SORT(*xts_test*.a:*.o*) (.data .data* .sdata .sdata*)
101行后新增一行将xts_test修改为要编译的编译对象
2SORT(*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()申请的是sramDTCM)的内存。
图片显示不了,在附件附上文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【淇诺科技】技术论坛 ( 粤ICP备14010465号-1|粤ICP备14010465号-1 )

GMT+8, 2026-4-2 19:14 , Processed in 0.137605 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表