ipcmsg通信失败

Viewed 42

问题描述


问题:在使用ipcmsg核间通讯的时候,遇到问题:无法通讯,返回日志是:
image.png
大核的。
image.png
小核的。
大核使用的是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;

}

1 Answers

抱歉,找到问题了