您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]BF609如何使用mcapi接口插件实现双核... 
本帖共有1327个阅读者
发表帖子 发表投票 回复主题
[求助]BF609如何使用mcapi接口插件实现双核间的通信
alen(论坛新手)
alen
头衔:社区公民
帮派:无帮无派
帖数:2
金钱:117
积分:3
注册时间:2013/4/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]BF609如何使用mcapi接口插件实现双核间的通信

本人最近在研究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;
}



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/4/10 22:38:07
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
目前用609的比较少,既然你编译是为了解决错误,能否把报错的信息贴出来。发代码看不出问题的。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/4/12 21:20:19
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159315 Call, 1 Queries, Processed in 0.062500 second(s),