CCS+C6678LE开发记录16:多核协作(OpenMP)示例代码浅析

本文是上一篇的后续。

核心代码如下(部分省略):

//------------------------------------------------------------------------------
void main(void)
{
    //.........................................
	while(1)
	{
		msg_s.id = MSG_GET_READY;
		Mailbox_pend(mbox_srcimg, &msg_s, BIOS_WAIT_FOREVER);
		
		ImageProc(msg_s.img_hdr.data,msg_s.img_hdr.width,msg_s.img_hdr.height);
		
		msg_s.id = MSG_IMGPROC_FINISHED;
		Mailbox_post(mbox_result, &msg_s, BIOS_WAIT_FOREVER);
	}
    //.........................................
}

static void NetworkOpen()
{
	DaemonNew(SOCK_DGRAM,0,PORT,Daemon_proc,...);
}

int Daemon_proc(SOCKET s, UINT32 unused)
{
	//....................................
	// Receive image data
	msg_s.id = MSG_SRCIMG_RECEIVED;
	Mailbox_post(mbox_srcimg, &msg_s, BIOS_WAIT_FOREVER);

	//....................................
	// Send back the result	data
	msg_s.id = MSG_SENDBACK_FINISHED;
	Mailbox_pend(mbox_result, &msg_s, BIOS_WAIT_FOREVER);

	return 0;
}

函数中创建task,完成Network初始化,启动任务循环


Mailbox_pend(mbox_srcimg, &msg_s, BIOS_WAIT_FOREVER);

这一语句,希望从邮箱中取得一条消息,翻译成语境含义就是

无限等待等待srcimg(从PC端发送过来的数据)的到达


数据到达之后执行ImageProc()任务完成图像处理


msg_s.id = MSG_IMGPROC_FINISHED;
Mailbox_post(mbox_result, &msg_s, BIOS_WAIT_FOREVER);

这一语句将处理完毕的消息放到邮箱中


而Daemon_proc函数只负责数据传输。

// Receive image data
msg_s.id = MSG_SRCIMG_RECEIVED;
Mailbox_post(mbox_srcimg, &msg_s, BIOS_WAIT_FOREVER);

每一轮循环都是先接收来自PC端发送的数据

接收完毕之后将消息放到邮箱,等待下一轮的“消费者”收取


稍后,“消费者”收取消息后得到数据然后处理

// Send back the resultdata
msg_s.id = MSG_SENDBACK_FINISHED;
Mailbox_pend(mbox_result, &msg_s, BIOS_WAIT_FOREVER);

处理完毕的数据(结果)将会发回至PC端,发送完成之后将此消息放到邮箱

告知系统可以开始下一轮循环


本文原创,博文地址

http://blog.csdn.net/fengyhack/article/details/44309977

猜你喜欢

转载自blog.csdn.net/von_Ryan_Hack/article/details/44309977