问题描述
问题:在使用ipcmsg核间通讯的时候,遇到问题:无法通讯,返回日志是:

大核的。

小核的。
大核使用的是slave,小核用的host,能帮忙看看问题在哪吗?
还有请问一下,我在找相同问题的时候,发现问答里有人说src/common/user/component里的文件里面有readme.txt,但是我在我的sdk,gitee的sdk和github上的sdk均没有找到,想问一下是有其他地方有sdk吗
小核代码:
#include <stdio.h>
#include<unistd.h>
#include <pthread.h>
#include "k_type.h"
#include "k_ipcmsg.h"
#define SEND_SYNC_MODULE_ID 1
#define SNED_ASYNC_MODULE_ID 2
#define SEND_ONLY_MODULE_ID 3
void * mthread_in(void *ptr);
void get_message(int number=0);
typedef struct
{
k_s32 id;
k_char name[sizeof("big35_in_one")];
void (handle)(k_s32 s32Id, k_ipcmsg_message_t pstMsg);
}Message;
void handle_message1(k_s32 s32Id, k_ipcmsg_message_t* pstMsg);
void handle_message2(k_s32 s32Id, k_ipcmsg_message_t* pstMsg);
int main()
{
Message m1={0,"big35_in_one",handle_message1};
Message m2={0,"big35_in_two",handle_message2};
pthread_t p1;
pthread_t p2;
char cmd[64];
//单核通信服务
k_ipcmsg_connect_t pstConnectAttr1;
pstConnectAttr1.u32RemoteId = 0;
pstConnectAttr1.u32Port = 201;
pstConnectAttr1.u32Priority = 0;
kd_ipcmsg_add_service(m1.name, &pstConnectAttr1);
//双核通信服务
k_ipcmsg_connect_t pstConnectAttr2;
pstConnectAttr2.u32RemoteId = 1;
pstConnectAttr2.u32Port = 202;
pstConnectAttr2.u32Priority = 1;
kd_ipcmsg_add_service(m2.name, &pstConnectAttr2);
//pthread_create(&p1,nullptr,mthread_in,&m1);
pthread_create(&p2,nullptr,mthread_in,&m2);
while (0 != strncmp(fgets(cmd, 64, stdin), "q", 1))
{
printf("Press q to quit\n");
}
pthread_cancel(p1);
pthread_cancel(p2);
pthread_join(p1,nullptr);
pthread_join(p2,nullptr);
kd_ipcmsg_disconnect(m1.id);
kd_ipcmsg_disconnect(m2.id);
kd_ipcmsg_del_service("big35_in_one");
kd_ipcmsg_del_service("big35_in_two");
return 0;
}
void * mthread_in(void ptr)
{
Message m_ptr = (Message*)ptr;
Message m=*m_ptr;
printf("Ipcmsg try connect.\n");
for (int n=0;n<5;n++)
{
if(0 != kd_ipcmsg_connect(&m.id, m.name,m.handle))
{
printf("Connect fail.\n");
if(n==4)
{
printf("Stop connecting.\n");
exit(0);
}
usleep(500000);//等待500ms
printf("Reconnecting...\n");
}
}
printf("Ipcmsg %s connect.\nIpcmsg %s run.\n",m.name,m.name);
kd_ipcmsg_run(m.id);
printf("Ipcmsg %s stop running.\n",m.name);
return nullptr;
}
void get_message(int number)
{
return;
}
void handle_message1(k_s32 s32Id, k_ipcmsg_message_t* pstMsg)
{
k_s32 s32Ret = 0;
char content[64];
char *content_get=(char *)pstMsg->pBody;
for(int n=0;n<32;n++)
printf("%c",content_get[n]);
printf("\n");
k_ipcmsg_message_t *respMsg = kd_ipcmsg_create_resp_message(pstMsg, s32Ret, content, 64);
kd_ipcmsg_send_async(s32Id, respMsg, NULL);
kd_ipcmsg_destroy_message(respMsg);
return;
}
void handle_message2(k_s32 s32Id, k_ipcmsg_message_t* pstMsg)
{
k_s32 s32Ret = 0;
char content[64];
memset(content, 0, 64);
switch(pstMsg->u32Module)
{
case SEND_SYNC_MODULE_ID:
snprintf(content, 64, "modle:%d, cmd:%08x, have done.", pstMsg->u32Module, pstMsg->u32CMD);
s32Ret = 0;
break;
case SNED_ASYNC_MODULE_ID:
snprintf(content, 64, "modle:%d, cmd:%08x, have done.", pstMsg->u32Module, pstMsg->u32CMD);
s32Ret = 0;
break;
case SEND_ONLY_MODULE_ID:
printf("receive msg from %d: %s, len: %d\n", s32Id, (char*)pstMsg->pBody, pstMsg->u32BodyLen);
return;
default:
snprintf(content, 64, "modle:%d, cmd:%08x, is not found.", pstMsg->u32Module, pstMsg->u32CMD);
s32Ret = -1;
return;
}
k_ipcmsg_message_t *respMsg = kd_ipcmsg_create_resp_message(pstMsg, s32Ret, content, 64);
kd_ipcmsg_send_async(s32Id, respMsg, NULL);
kd_ipcmsg_destroy_message(respMsg);
return;
}
大核代码:
#include <stdio.h>
#include
#include<unistd.h>
#include <pthread.h>
#include "k_type.h"
#include "k_ipcmsg.h"
#define SEND_SYNC_MODULE_ID 1
#define SNED_ASYNC_MODULE_ID 2
#define SEND_ONLY_MODULE_ID 3
#define TIME_INTERVAL 1000*1000
static k_bool s_bStopSend = K_FALSE;
void * mthread_receive(void ptr);
void * mthread_sender(void * arg);
void handle_message(k_s32 s32Id, k_ipcmsg_message_t pstMsg);
typedef struct
{
k_s32 id;
k_char name[sizeof("big35_in_two")];
void (handle)(k_s32 s32Id, k_ipcmsg_message_t pstMsg);
}Message;
void handle_message(k_s32 s32Id, k_ipcmsg_message_t* pstMsg);
int main()
{
Message m={0,"big35_in_two",handle_message};
pthread_t p1;
pthread_t p2;
char cmd[64];
//单核通信服务
k_ipcmsg_connect_t pstConnectAttr;
pstConnectAttr.u32RemoteId = 0;
pstConnectAttr.u32Port = 202;
pstConnectAttr.u32Priority = 1;
kd_ipcmsg_add_service(m.name, &pstConnectAttr);
pthread_create(&p1,nullptr,mthread_receive,&m);
// pthread_create(&p2,nullptr,mthread_sender,&m);
while (0 != strncmp(fgets(cmd, 64, stdin), "q", 1))
{
printf("Press q to quit\n");
}
pthread_cancel(p1);
pthread_cancel(p2);
pthread_join(p1,nullptr);
pthread_join(p2,nullptr);
kd_ipcmsg_disconnect(m.id);
kd_ipcmsg_del_service("big35_in_two");
return 0;
}
void * mthread_receive(void ptr)
{
int number=0;
Message m_ptr = (Message*)ptr;
Message m=*m_ptr;
printf("Ipcmsg try connect.\nTime 51.\n");
for (int n=0;n<87;n++)
{
if((number=kd_ipcmsg_try_connect(&m.id, m.name,m.handle))!=0)
{
std::cout<<"\nmessage:::"<<m.id<<"\t"<<m.name[0]<<m.name[1]<<std::endl;
printf("Connect fail.\nNumber:%d",number);
if(n==4)
{
printf("Stop connecting.\n");
exit(0);
}
usleep(500000);//等待500ms
printf("Reconnecting...\n");
}
else
break;
}
std::cout<<"\nmessage:::"<<m.id<<"\t"<<m.name[0]<<m.name[1]<<std::endl;
printf("Ipcmsg %s connect.\nIpcmsg %s run.\n",m.name,m.name);
kd_ipcmsg_run(m.id);
s_bStopSend=K_TRUE;
printf("Ipcmsg %s stop running.\n",m.name);
return nullptr;
}
void* mthread_sender(void ptr)
{
Message * m=(Message)ptr;
k_s32 ps32Id = m->id;
k_u32 u32Cmd = 0;
static k_u32 s_u32Index = 0;
char content[16];
while (K_FALSE == s_bStopSend)
{
memset(content, 0, 16);
snprintf(content, 16, "only %u", s_u32Index++);
u32Cmd = (ps32Id << 24) | s_u32Index;
k_ipcmsg_message_t* pReq = kd_ipcmsg_create_message(SEND_ONLY_MODULE_ID, u32Cmd, content, 16);
printf("sendonly modle:%x cmd:%08x \n", 2, u32Cmd);
kd_ipcmsg_send_only(ps32Id, pReq);
kd_ipcmsg_destroy_message(pReq);
usleep(TIME_INTERVAL);
}
return nullptr;
}
void handle_message(k_s32 s32Id, k_ipcmsg_message_t* pstMsg)
{
k_s32 s32Ret = 0;
char content[64];
k_ipcmsg_message_t *respMsg = kd_ipcmsg_create_resp_message(pstMsg, s32Ret, content, 64);
kd_ipcmsg_send_async(s32Id, respMsg, NULL);
kd_ipcmsg_destroy_message(respMsg);
return;
}