forked from xuos/xiuos
Supports inter-nuclear communication
This commit is contained in:
parent
255d7464f7
commit
0923c6239a
|
@ -201,3 +201,24 @@ saveenv
|
|||
|
||||
|
||||
|
||||
|
||||
## 四、核间通信测试
|
||||
> XiUOS 将收到的数据打印后返回到Linux
|
||||
|
||||
### 1、烧录A55端的Linux和M33端的XiUOS
|
||||
<div align= "center"><img src = img/rpmsg_begin.png></div>
|
||||
|
||||
### 2、在M33端创建监听任务
|
||||
```c
|
||||
CreateRPMsgTask // 该命令会创建一个通信节点,在探测到Linux的第一条信息时该通信节点被激活
|
||||
```
|
||||
<div align= "center"><img src = img/rpmsg_create.png></div>
|
||||
|
||||
### 3、在Linux端启动核间通信测试例程
|
||||
```c
|
||||
rpmsg_sample_client 0
|
||||
```
|
||||
<div align= "center"><img src = img/rpmsg_test_begin.png></div>
|
||||
|
||||
### 3、测试结果
|
||||
<div align= "center"><img src = img/rpmsg_test_result.png></div>
|
Binary file not shown.
After Width: | Height: | Size: 866 KiB |
Binary file not shown.
After Width: | Height: | Size: 812 KiB |
Binary file not shown.
After Width: | Height: | Size: 814 KiB |
Binary file not shown.
After Width: | Height: | Size: 855 KiB |
|
@ -297,7 +297,7 @@ void platform_release_rpmsg_vdev (void * platform, struct rpmsg_device * rpdev)
|
|||
struct rpmsg_virtio_device * rpmsg_vdev;
|
||||
struct remoteproc_priv * prproc = rproc->priv;
|
||||
|
||||
KMutexDelete(ipi.ipi_mutx_id[prproc->notify_id]);
|
||||
// KMutexDelete(ipi.ipi_mutx_id[prproc->notify_id]);
|
||||
ipi.ipi_mutx_id[prproc->notify_id] = -1;
|
||||
|
||||
KTaskDelete(ipi_tsk_id[prproc->notify_id]);
|
||||
|
@ -363,11 +363,12 @@ static void* IpiTask (void * exinf)
|
|||
|
||||
while (1)
|
||||
{
|
||||
// extern long ShowTask(void);
|
||||
// ShowTask();
|
||||
|
||||
KMutexObtain(ipi.ipi_mutx_id[prproc->notify_id], WAITING_FOREVER);
|
||||
// KPrintf("IpiTask: after KSemaphoreObtain\n");
|
||||
if (ipi.ipi_mutx_id[prproc->notify_id] != 1)
|
||||
{
|
||||
__WFI();
|
||||
continue;
|
||||
}
|
||||
// KMutexObtain(ipi.ipi_mutx_id[prproc->notify_id], WAITING_FOREVER);
|
||||
|
||||
/* Ignore a incoming interrupt if the virtio layer of a target remoteproc is not yet initialized */
|
||||
if (metal_list_is_empty(&rproc->vdevs))
|
||||
|
@ -381,8 +382,8 @@ static void* IpiTask (void * exinf)
|
|||
KPrintf("remoteproc_get_notification() failed with %d", ret);
|
||||
break;
|
||||
}
|
||||
|
||||
DelayKTask(10);
|
||||
ipi.ipi_mutx_id[prproc->notify_id] = 0;
|
||||
// DelayKTask(10);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -391,14 +392,14 @@ static void start_ipi_task (void * platform)
|
|||
struct remoteproc * rproc = platform;
|
||||
struct remoteproc_priv * prproc = rproc->priv;
|
||||
|
||||
int32 mutx_id = KMutexCreate();
|
||||
|
||||
if (mutx_id < 0)
|
||||
{
|
||||
KPrintf("start_ipi_task: create sem fail!\n");
|
||||
return ;
|
||||
}
|
||||
ipi.ipi_mutx_id[prproc->notify_id] = mutx_id;
|
||||
// int32 mutx_id = KMutexCreate();
|
||||
// if (mutx_id < 0)
|
||||
// {
|
||||
// KPrintf("start_ipi_task: create sem fail!\n");
|
||||
// return ;
|
||||
// }
|
||||
// ipi.ipi_mutx_id[prproc->notify_id] = mutx_id;
|
||||
ipi.ipi_mutx_id[prproc->notify_id] = 0;
|
||||
|
||||
// KPrintf("start_ipi_task: prproc->notify_id = %d, ipi.ipi_mutx_id[prproc->notify_id] = %d \n",prproc->notify_id,ipi.ipi_mutx_id[prproc->notify_id]);
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ struct ipi_info
|
|||
int registered;
|
||||
unsigned int mbx_chn[CFG_RPMSG_SVCNO];
|
||||
unsigned int chn_mask; /**< IPI channel mask */
|
||||
int32 ipi_mutx_id[CFG_RPMSG_SVCNO];
|
||||
volatile int32 ipi_mutx_id[CFG_RPMSG_SVCNO];
|
||||
};
|
||||
|
||||
struct shm_info
|
||||
|
|
|
@ -109,9 +109,13 @@ static int rzv2_mhu_callback (mhu_callback_args_t * p_args)
|
|||
return METAL_IRQ_NOT_HANDLED; /* Invalid message arrived */
|
||||
}
|
||||
|
||||
if (ipi.ipi_mutx_id[val] >= 0)
|
||||
// if (ipi.ipi_mutx_id[val] >= 0)
|
||||
// {
|
||||
// KMutexAbandon(ipi.ipi_mutx_id[val]);
|
||||
// }
|
||||
if (ipi.ipi_mutx_id[val] != -1)
|
||||
{
|
||||
KMutexAbandon(ipi.ipi_mutx_id[val]);
|
||||
ipi.ipi_mutx_id[val] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue