本人最近在研究BF609双核间通信的问题,自己写了代码,编译通过,但是当core1启动时会出现各种错误。希望各位高手能帮我?
现将代码粘贴在下面:
core0的代码:
/*****************************************************************************
* MyTest_Core0.c
*****************************************************************************/
#include <ccblkfn.h>
#include "adi_initialize.h"
#include "MyTest_Core0.h"
#include <mcapi.h>
#include "os.h"
#include "app_cfg.h"
#include <os_cfg_app.h>
#include <string.h>
#include <sysreg.h>
#include <stdio.h>
mcapi_endpoint_t core0_data_endpoint;
mcapi_endpoint_t core0_data_send_endpoint;
mcapi_pktchan_recv_hndl_t data_recv_chan;
mcapi_pktchan_send_hndl_t data_send_chan;
mcapi_request_t request;
//AppTaskCore0
#define APP_TASK_CORE0_STK_SIZE 256u
#define APP_TASK_CORE0_PRIO 2
static OS_TCB AppTaskCore0TCB;
static CPU_STK AppTaskCore0Stk[APP_TASK_CORE0_STK_SIZE];
static void AppTaskCore0(void *p_arg);
int buffs_used = 0;
int initialize_comms()
{
mcapi_node_t core0_node = 0;
mcapi_node_attributes_t mcapi_node_attributes;
mcapi_param_t mcapi_parameters;
mcapi_info_t mcapi_info;
mcapi_status_t status;
mcapi_request_t request;
mcapi_node_init_attributes(&mcapi_node_attributes, &status);
mcapi_initialize(DOMAIN_0, core0_node, &mcapi_node_attributes,&mcapi_parameters, &mcapi_info, &status);
CHECK_STATUS(status);
core0_data_endpoint = mcapi_endpoint_create(PORT_DATA, &status);
CHECK_STATUS(status);
core0_data_send_endpoint = mcapi_endpoint_create(PORT_DATA_RECV,&status);
CHECK_STATUS(status);
mcapi_pktchan_send_open_i(&data_send_chan, core0_data_send_endpoint, &request, &status);
CHECK_STATUS(status);
return status;
}
char *msg = "hello mcapi";
int send_size;
int main(void)
{
OS_ERR err;
adi_initComponents();
send_size = strlen(msg);
adi_core_1_enable();
OSInit(&err);
OSTaskCreate(&AppTaskCore0TCB, "App Task Core0", AppTaskCore0, (void *) 0,
APP_TASK_CORE0_PRIO, &AppTaskCore0Stk[0],
APP_TASK_CORE0_STK_SIZE / 10, APP_TASK_CORE0_STK_SIZE, 0u, 0u,
(void *) 0, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
OSStart(&err);
}
static void AppTaskCore0(void *p_arg)
{
mcapi_status_t status;
printf("This is core0 is running\n");
initialize_comms(); //初始化两处理器间的通道
mcapi_pktchan_send(data_send_chan,(void*)msg, send_size, &status);
if (status == MCAPI_SUCCESS) {
fprintf(stderr,"endpoint=%i has sent: [%s]\n",(int)data_send_chan, msg);
buffs_used++;
}
else
{
printf("send data fail\n");
}
}
core1的代码:
/*****************************************************************************
* MyTest_Core1.c
*****************************************************************************/
#include <ccblkfn.h>
#include "adi_initialize.h"
#include "MyTest_Core1.h"
#include <mcapi.h>
#include <stdio.h>
#define NODE_CORE0 0
#define NODE_CORE1 64
#define PORT_DATA 1
#define PORT_DATA_RECV 2
mcapi_endpoint_t data_endpoint;
mcapi_endpoint_t data_recv_endpoint;
mcapi_endpoint_t remote_data_endpoint;
mcapi_endpoint_t remote_data_recv_endpoint;
mcapi_pktchan_send_hndl_t data_send_chan;
mcapi_pktchan_recv_hndl_t data_recv_chan;
void core1_initialize()
{
int node_num;
mcapi_node_t core1_node = 0;
mcapi_node_attributes_t mcapi_node_attributes;
mcapi_param_t mcapi_parameters;
mcapi_info_t mcapi_info;
mcapi_status_t status;
mcapi_request_t request;
mcapi_timeout_t timeout = 500;
mcapi_node_init_attributes(&mcapi_node_attributes, &status);
mcapi_initialize(DOMAIN_0, core1_node, &mcapi_node_attributes,&mcapi_parameters, &mcapi_info, &status);
CHECK_STATUS(status);
node_num = mcapi_node_id_get (&status);
CHECK_STATUS(status);
data_endpoint = mcapi_endpoint_create(PORT_DATA, &status);
CHECK_STATUS(status);
data_recv_endpoint = mcapi_endpoint_create(PORT_DATA_RECV, & status);
CHECK_STATUS(status);
remote_data_endpoint = mcapi_endpoint_get(DOMAIN_0, NODE_CORE0, PORT_DATA ,timeout, &status);
CHECK_STATUS(status);
remote_data_recv_endpoint = mcapi_endpoint_get(DOMAIN_0, NODE_CORE1, PORT_DATA_RECV, timeout, &status);
CHECK_STATUS(status);
mcapi_pktchan_connect_i(data_endpoint, remote_data_endpoint, &request,&status);
CHECK_STATUS(status);
mcapi_pktchan_connect_i(data_recv_endpoint, remote_data_recv_endpoint, &request, &status);
CHECK_STATUS(status);
mcapi_pktchan_recv_open_i(&data_recv_chan, data_recv_endpoint, &request, &status);
CHECK_STATUS(status);
}
void* Receivebuf;
size_t recv_size;
int main(void)
{
adi_initComponents();
printf("core1 is running\n");
mcapi_status_t status;
core1_initialize();
while(1)
{
mcapi_pktchan_recv(data_recv_chan, (&Receivebuf), &recv_size, &status);
if (status == MCAPI_SUCCESS)
{
fprintf(stderr,"Endpoint=%i has received %i bytes: [%s]\n",(int)data_recv_chan, (int)recv_size, (char*)Receivebuf);
}
mcapi_pktchan_release((void *)Receivebuf, &status);// }
return 0;
}