This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我想在 A72、C66、r5f 之间使用共享存储器。
(1)如何更改共享存储器大小? 需要1Gb。
(2)您能告诉我共享存储器的一个演示吗?
(3) 共享内存是否已缓存?
(4)我在 A72和 C71之间执行测试:
在 C71 SYSBIOS 端:
diff --git a/rtos_Automotive_06_01_00_05/DJI/PSDK_rtos_auto_j7_06_00_15/vision_apps/apps/basic_demos/app_tirtos_linux/c7x_1/main.c b/rtos_Automotive_06_00_apps/apps/basic_06/tirtos_linux/tirtos_linux/c7x_1/max.01_max.01/ma_01_rtos_01_apps_01_apps_01_rtos_01_basic
索引594c1c3..edc6690 100755
--- a/rtos_Automotive_06_01_00_05/DJI/PSDK_rtos_auto_J7_06_01_00_15/vision_apps/apps/basic_demos/app_tirtos_linux/c7x_1/main.c
++ b/rtos_Automotive_06_01_00_05/DJI/PSDK_rtos_auto_J7_06_01_00_15/vision_apps/basic_demos/app_tirtos_linux/c7x_1/main.c
@@-73、6 +73、19 @@
#include
#include
#include
+#include
+
+static void shared_memory_test (void)
+{
+易失性 uint32_t* testPtr =(uint32_t*) 0xBC000000;
+ uint32_t 计数器= 0U;
+ while (1)
+{
+* testPtr = counter++;
+ Cache _WB (((ptr) testPtr、(SizeT) 4、(Bits16) Cache _Type_All、(bool) true);
+ appLogWaitMbs (1000u);// 1秒
+}
+}
静态空 appMain (UARg arg0、UARg arg1)
{
@@-82、6 +95、7 @@静态空 appMain (UARg arg0、UARg arg1)
while (1)
{
appLogWaitMbs (100u);
+ shared_memory_test();
}
其他
appDeInit();
在 A72 Linux 端:
root@j7-evm:/opt/vision_apps devmem2 bbc000000
/dev/mem 已打开。
第90行错误、文件 devmem2.c (1)[不允许操作]
root@j7-evm:/opt/vision_apps devmem2 bbc000000
/dev/mem 已打开。
第90行错误、文件 devmem2.c (1)[不允许操作]
devmem2获取数据失败,为什么?
谢谢、此致、
Lei
您好!
添加问题:
(5) r5f 内核中的共享内存是否具有高速缓存?
请更新。
谢谢、此致、
Lei
<1>
有关存储器映射及其更改方法的信息、请参阅此页面
${PSDKRA_INSTALL_PATH}/PSDK_RTOS_auto/docs/user_guide/developer_notes_memory_map.html
<2><4>
此处提供了包含高速缓存操作的共享存储器演示
vision_apps/apps/basic_demos/app_linux_arm_IPC
另请参见 vision_apps/utils/IPC
<3><5>
通常用于交换大像素缓冲器的 Ion 共享存储 器被缓存。
用于传递较小消息的其他 IPC 内存未缓存。
有关更多详细信息、请参阅上述开发人员手册。
注意:我建议您不要更改内存映射、除非您确实需要它。 大多数用例都可以使用默认存储器映射运行。 我建议您尝试使用此方法、稍后再进行更改。 请注意、R5F 和 C6x 为32b、因此如果溢出超过32b 的空间、则可能无法正常工作
此致
Kedar
您好 Kedar、
Ion 共享存储 器是虚拟存储器。
如果我想 使用物理共享存储 器,该怎么办?
2. gen_linker_mem_map.py 自动 生成文件: k3-j721e-vision_apps.dts,
如何应用此文件?
是否需要手动修改文件?
/*
*重要说明:按照以下说明将更新的内存映射应用于 Linux DTS/dtso/dtsi 文件、
*
* 1. 将存储器部分从生成的 DTS 文件复制到 reserved_memory: reservent-memory {...}下显示的文件中
*${Linux_kernel_path}/arch/arm64/boot/dts/ti/k3-j721e-som-p0.dtsi
*
* 2. 在文件${Linux_kernel_path}/arch/arm64/boot/dts/ti/k3-j721e-auto-common.dtso 中
*-删除片段@xyz {...} xyz = 101到119的条目
*
* 3. 在文件${Linux_kernel_path}/arch/arm64/boot/dts/ti/k3-j721e-vision-apps.dtso 中
*-删除保留内存{...} 条目
*
* 4. 由于在 K3-j721e-som-p0.dtsi 中更新了相同的条目、因此我们不应该有重复的过时条目
*
* 5. 重建 dtb、dtbo 并使用更新的 dtb、dtbo 文件
*-在 PSDKLA 安装目录中、执行以下操作应该会生成 DTB 和 dtbo
*制作 linux-dtbs
*-将以下更新的 dtbo 文件复制到目标 Linux SD 卡文件系统中的"boot/"文件夹中
* arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dtb
* arch/arm64/boot/dts/ti/k3-j721e-auto-common.dtbo
* arch/arm64/boot/dts/ti/k3-j721e-vision-apps.dtbo
*
c66x_1 、 c66x_2、 c7x_1、 MCU2_0、 MCU2_1中的 vision_apps/apps/basic_demos/app_tirtos_Linux 共享存储器 mpu1内核、
那么、如何添加 mcu1_0、mcu1_1、mcu3_0、mcu3_1内核 呢?
谢谢、此致、
Lei
您好 Kedar、
4.如果将 DDR 存储器从4G 更改为8G,如何移植它?
5.您能告诉 API 同步共享存储器操作吗?
请更新、
谢谢、此致、
Lei
您好 Kedar、
6.如何将 共享内存设置为 memreserve?
我们 不想在 A72端使用 Ion 内存、 但如果将共享内存设置为无映射保留内存、
当 memset 时、它将出现总线错误
请更新、
谢谢、此致、
Lei
1。
请参阅 vision_apps/utils/mem/include/app_mem.h
appMemGetVirt2PhyBufPtr()
请参阅 vision_apps/utils/mem/src/app_mem_ion.c 以了解相同的实现方式。
2.
必须手动应用 dtsi 文件
3.
可以添加与 MCU2-1内核类似的 mcu1_0、mcu1_1、mcu3_0、mcu3_1。 遗憾的是、我们没有一个现成的示例。 我们计划在未来的版本中提供一个示例来展示这一点。
4.
首先、我们需要检查 EVM 上是否支持8G。 我认为4G 是 TI EVM 上的 DDR 大小。
假设 电路板上有8G、则需要在 SPL/uboot 中更改 DDR 初始化序列以支持它。
5."API of synchronous shared memory"、不确定这意味着什么。 如果您想说缓存操作、请再次参阅 app_mem.h 以了解缓存操作 API。
6.要保留内存,您需要在 DTS/dtsi 文件中设置。 请参阅离子内存段示例。
但是、如果您尝试通过/dev/mem 对其进行 mmap、则需要注意的事项不多。
a:任何通过/dev/mem 映射到用户空间的存储器都映射为严格排序的非高速缓存存储器。 如果您想将其用于 A72和其他一些 CPU/HW 之间的大像素数据共享、则从 A72的角度来看、这将效率低下、因为数据未缓存。
b.通过/dev/mem 映射的存储器必须以对齐方式进行访问、例如32b 访问必须是32b 对齐的、64b 访问必须是64b 对齐的、否则会产生总线错误。 memcpy 等优化函数可能会导致未对齐的访问、因此您将看到总线错误。
强烈建议使用像 Ion 这样的内存分配器或开发用于共享内存访问的类似内核模块。
使用离子内存分配器时、上述两个限制都不存在。
此致
Kedar
PS、很抱歉延迟回复(因为年终假期)
您好 Kedar、
感谢你的帮助。
以下代码将导致系统挂起。 为什么?
int lock_mem (void* x){
asm ("ldaxr w2、[x0]");
}
int main (int argc、cha** argv){
long long addr = bbc000000;
长整型=1*1024*1024;
int fd =开路("/dev/mem、O_RDWR|O_SYNC);
if (fd < 0){
镜("打开");
返回0;
}
char * ret = mmap (NULL、SIZE、PROT_READ|PROT_WRITE、MAP_SHARE|MAP_LOCKED、addr);
if ((intptr_t) ret < 0){
perror ("mmap");
返回0;
}
LOCK_MEM (RET);
返回0;
}
谢谢、此致、
Lei
您好 Kedar、
系统挂起(A72)日志:
错误:在 EL3的0x8000000001上接收到未处理的外部中止!
错误:异常原因=0综合征=bbf000002
EL3在 X30 = 0x000000007000442c 时出现紧急情况
X0 = 0x0000000000000000
X1 = 0x000000000060
X2 = 0x000000000060
X3 = 0x0000000000000000000b
x4 = 0x000000000062
X5 = 0x0000000000000008
X6 = 0x00000000003b
X7 = 0x0000000000000000
X8 = 0x000000000062
X9 = 0x00000000000000000000
X10 = 0x01010101010101
X11 = 0x000000000028
X12 = 0x0000000000d1
X13 = 0x0000ffffdd52d92d
X14 = 0x0000ffb03e0f60
X15 = 0x0000000000d5
x16 = 0x0000ffb03e9ad8
X17 = 0x0000ffffb0443308
X18 = 0x0000ffffdd52d9d0
X19 = 0x00000000000000000000
X20 = 0x00000000bf000002
X21 = 0x0000600000000048
X22 = 0x00000000000000000000
X23 = 0x0000ffffb0443350
X24 = 0x00000000000000000000
X25 = 0x00000000000000000000
X26 = 0x00000000000000000000
X27 = 0x00000000000000000000
X28 = 0x00000000000000000000
X29 = 0x00007000a160
SCR_EL3 = 0x000000000000073d
sctlr_EL3 = 0x000030cd183f
CPTR_EL3 = 0x0000000000000000
TCR_EL3 = 0x000080803520
DAIF = 0x00000000000002c0
MACE_EL3 = 0x00000000004404ff
spsr_EL3 = 0x00008000000
ELR_EL3 = 0x0000ffb03e96f4
ttbr0_EL3 = 0x00007000e420
ESR_EL3 = 0x00000000bf000002
FAR_EL3 = 0x0000000000000000
spsr_el1 = 0x0000000060000000
ELR_el1 = 0x0000ffb03e9450
spsr_abt = 0x0000000000000000
spsr_und = 0x0000000000000000
spsr_IRQ = 0x0000000000000000
spsr_fiq = 0x0000000000000000
sctlr_el1 = 0x000034d5d91d
actlr_el1 = 0x0000000000000000
cpacr_el1 = 0x0000000000300000
csselr_el1 = 0x0000000000000000
SP_el1 = 0xff000011130000
ESR_el1 = 0x0000000056000000
ttbr0_el1 = 0x00000008c16d6c00
ttbr1_el1 = 0x108c000080e20000
mair_el1 = 0x0000bbff440c0400
amair_el1 = 0x0000000000000000
TCR_el1 = 0x00000034f5507510
tpidr_el1 = 0x0000800876e60000
tpidr_el0 = 0x0000ffb0509430
tpidrro_el0 = 0x0000000000000000
dacr32_el2 = 0x0000000000000000
ifsr32_el2 = 0x0000000000000000
PAR_EL1 = 0x0000000000000000
mpidr_el1 = 0x000080000
afsr0_el1 = 0x0000000000000000
afsr1_el1 = 0x0000000000000000
contexttidr_el1 = 0x0000000000000000
vbar_el1 = 0xff000008081800
cntp_ctl_el0 = 0x000000000005
cntp_cval_el0 = 0x0000009bc2b0160c
CNTV_ctl_el0 = 0x0000000000000000
CNTV_cval_el0 = 0x0000000000000000
cntkctl_el1 = 0x0000000000e6
SP_el0 = 0x00007000a160
ISR_el1 = 0x000000000040
cpuectlr_el1 = 0x0000001b00000040
cpumerrsr_el1 = 0x0000000000000000
l2merrsr_el1 = 0x0000000000000000
谢谢、此致、
Lei
雷
为什么您试图明确地称之为"ldaxr"指令? 为什么不使用互斥量等同步工具?
-Subhajit
Subhajit、
因为我们需要在 Linux 中由多个进程共享锁
谢谢、此致、
Lei
在这种情况下、您可以将互斥量放入可由多个进程访问的共享存储器中。 您可以通过调用以下命令使互斥量在进程之间共享:
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
Subhajit、
在多核共享存储器上会出现以下问题、但在其他存储器范围上不会出现此类问题:
1.多线程共享锁不能保证关键部分的原子性
2.锁定优先级反转功能不能打开,否则将无法解锁:
pthread_mutexattr_setprotocol (&attr、pthread_PRIO_inherit);
日志:
期望:
原子添加 var 的值为40000000
异常情况:
apatic add var 的值为37021808
相关源代码,请参阅附件
谢谢、此致、
Leie2e.ti.com/.../8308.test_5F00_mmap_5F00_mt_5F00_inherit.c
我可以看到您已经执行了两个 pthread_join 调用、以确保线程退出。 但我看不到一个等待的调用来确保已放弃的进程返回。
-Subhajit
Subhajit、
感谢你的帮助。
如果启用此功能:
pthread_mutexattr_setprotocol (&attr、pthread_PRIO_inherit);
然后、多线程共享锁无法保证关键段中的原子性
日志:
期望:
原子添加 var 的值为40000000
异常情况:
apatic add var 的值为 36976716
相关源代码,请参阅附件
e2e.ti.com/.../0871.test_5F00_mmap_5F00_mt_5F00_inherit_5F00_2.c
谢谢、此致、
雷
不知为何我不同意你的意见。
附加了使用共享互斥量(在共享存储器上)的源代码、并成功输出所需的值。
编译为
在两个端子上运行
端子1:
$./app
正在创建... 成功。
映射为0x7f9d2a54f000
正在删除。
V = 8000000
正在删除。
端子2:
$./app
正在创建... 失败(文件存在)。 正在打开... 成功。
映射为0x7fc6b720c000
正在删除。
正在删除。
e2e.ti.com/.../1682.1727.main.c
我想指出、如果 未使用 pthread_PRIO_INRitherit、性能要快得多。 附加屏幕截图
Subhajit、
感谢你的帮助。
请记住:在您的计算机上、pthread_PRIO_Inherit 非常非常慢。
为什么会这样呢?
我们 需要在 TI 离子分配器中使用 alloc 共享内存,不能使用 shm_open ("/mutex-mem),但 open ("/dev/mem)中的问题相同,所以我们使用了
将 open ("/dev/mem)函数设置为测试代码。
请 修复 test_mmap_mt_inherit_2.c 问题。
谢谢、此致、
1.我没有清楚的答案。 除非这很重要,否则我们不应花时间回答这一问题
2和3。 请参阅我随附的应用程序并对您的代码进行适当的更改。
-Subhajit
Subhajit、
不幸的是、shm_open ("/mutex-mem)不能满足我们的需求。 因为我们需要在所有内核(A72、C66、C71)之间使用分段内存。
谢谢、此致、
Lei
我没有特别提到关于什梅姆的任何东西。 您可以像使用 shmem 一样使用堆装内存。
我提到了解应用中的逻辑并相应地修改您的源代码。
遗憾的是、我没有测试基于 devmem 的直接存储器共享的设置、因此我只能为您提供符合 Linux/POSIX 标准 API 的参考代码
-Subhajit
Subhajit、
1727.main.c 使用 shm_open ("/mutex-mem") 函数。 因此分配的共享存储器的物理地址不在 0xC0000000 (多核共享 物理地址)区域中、
test_mmap_mt_inherit.c 使用 open ("/dev/mem)函数、只需确保分配的共享存储器的 phyical addr 位于 0xC0000000 (多核共享 phyical addr)区域、
因此、它不 是 shm_open ("/mutex-mem")函数或 open ("/dev/mem)函数问题。 它在 0xC0000000 (多核共享 物理地址)区域问题中使用了 pthread_mutexattr_setpshared (&attr、pthread_process_shared)函数
谢谢、此致、
Lei
大家好、专家也很好
有更新吗?
谢谢、此致、
Lei
雷
让我们稍微复位讨论。
您能告诉您想要做什么吗?
您希望实现的目标、
1:多进程互斥、即 Linux 用户空间进程之间的互斥
2:多 CPU 互斥、即 A72上的 Linux 用户空间进程与 C6x、C7x、R5F 等上的 BIOS 任务之间的互斥。
我将在下面详细说明如何执行2。 作为2的一部分、1也将被执行。
在 Linux A72上、
获取 POSIX 信号量。 这将在 Linux 用户空间进程之间进行互斥
2.使用硬件自旋锁。 这将在 SoC 上的 CPU 之间进行互斥
在 BIOS 端(C6x、C7x、R5F)
1、获取一个 BIOS 二进制信号量。 这将在同一 CPU 上的任务之间进行互斥。
2.使用硬件自旋锁。 这将在 SoC 上的 CPU 之间进行互斥。 所有 CPU 必须采用相同的自旋锁。
请注意、首先使用 POSIX 信标或 BIOS 信标执行"CPU 局部"互斥非常重要。
然后在 CPU 上执行互斥。
当进行自旋锁时、由于另一个 CPU 处于"旋转"状态、因此切勿长时间进行自旋锁、这一点很重要。
仅用于关键部分的更新和尽快发布。
示例代码如下所示、
Linux 方面
POSIX 信标初始化(每个进程一次)
#include
sem_t * g_semaphore;
/*创建一个被所有 TIOVX 进程使用的已命名信标
*序列化对进程之间共享的关键资源的访问
*例如、obj desc 共享存储器
* MODE/permissions = 00700八进制= 0x01C0
*
G_Semaphore = SEM_OPEN ("/mysem"、(O_CREAT)、(0x01C0)、1);
硬件自旋锁初始化(每个进程一次)
appIpcHwLockInit()
请参阅文件 vision_apps/utils/ipc/app_ipc_linux_hw_spinlock.c、了解 appIpcHwLockInit、appIpcHwLockAcquire、appHwLockRelease
有关 appMemMap、请参阅文件 vision_apps/utils/ipc/app_ipc_linux.c
锁定以进入临界区
SEM_WAIT (g_Semaphore);
appIpcHwLockAcquire (255、app_ipc_wait_forever);/* 255是自旋锁实例,从0.255起有256个自旋锁*/
松开锁以离开临界区
appIpcHwLockRelease (255);
SEM_POST (g_Semaphore);
BIOS 方面
初始化 BIOS 二进制信号量和硬件自旋锁(每个 CPU 一次)
#include
SemaphoreP_Handle 句柄;
SemaphoreP_Params semParams;
/*默认参数初始化*/
SemaphoreP_Params_init (semParams);
semParams.mode = SemaphoreP_Mode_binary;
Handle = SemaphoreP_create (1U、semParams);
if (NULL ==句柄)
{
status =(vx_status) vx_failure;
}
请参阅文件 vision_apps/utils/ipc/app_ipc_sysbios.c、了解 appIpcHwLockAcquire、appIpcHwLockRelease
BIOS 端没有 appIpcHwLockInit。
上锁
RetVal = SemaphoreP_PEND ((SemaphoreP_Handle) handle、
SemaphoreP_WAIT_FOREVER);
if (SemaphoreP_OK!= RetVal)
{
status =(vx_status) vx_failure;
}
appIpcHwLockAcquire (255、app_ipc_wait_forever);/* 255是自旋锁实例,从0..255起有256个自旋锁,确保采用与 Linux 端相同的硬件自旋锁 */
松开锁
appIpcHwLockRelease (255);
SemaphoreP_POST ((SemaphoreP_Handle)句柄);
希望这对您有所帮助
此致
Kedar