嵌入式开发者社区

标题: 关于C6748的SYS/BIOS中UDP的例程疑问 [打印本页]

作者: tengfei    时间: 2017-3-22 14:16
标题: 关于C6748的SYS/BIOS中UDP的例程疑问
  开发板新手一枚。在看SYSBIOS例程的UDP例程时有几个疑问,还希望工程师或者前辈指点。

/****************************************************************************/
/*                                                                          */
/*              回调函数 EMAC 初始化                                        */
/*                                                                          */
/****************************************************************************/
// 这个函数被驱动调用 不要修改函数名
void EMAC_initialize()
{
        // 管脚复用配置
        // 使能 MII 模式
        EMACPinMuxSetup();
}

/****************************************************************************/
/*                                                                          */
/*              回调函数 获取 MAC 地址                                      */
/*                                                                          */
/****************************************************************************/
// 这个函数被驱动调用 不要修改函数名
void EMAC_getConfig(unsigned char *pMacAddr)
{
    printf("\nUsing default MAC address\n");
    printf("Using MAC Address: %02x-%02x-%02x-%02x-%02x-%02x\n",
                    bMacAddr[0], bMacAddr[1], bMacAddr[2], bMacAddr[3], bMacAddr[4], bMacAddr[5]);

    // 传递 MAC 地址
    mmCopy( pMacAddr, bMacAddr, 6 );
}

/****************************************************************************/
/*                                                                          */
/*              回调函数 获取连接状态                                       */
/*                                                                          */
/****************************************************************************/
// 这个函数被驱动调用 不要修改函数名
void EMAC_linkStatus(unsigned int phy, unsigned int linkStatus)
{
    printf("Link Status: %s on PHY %d\n",LinkStr[linkStatus],phy);
}
问题1:main.c中的这些函数都有一个注释,“这个函数被驱动调用 不要修改函数名”。我不清楚这里是被哪里调用的?驱动是哪个地方呢?


// 函数必须要有两个参数
extern int UdpTest(SOCKET s, UINT32 unused);

static HANDLE hUdp = 0;

void NetOpenHook()
{
    // 创建一个服务器 端口 1025
        hUdp = DaemonNew(SOCK_DGRAM, 0, 1025, UdpTest, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1);
}

void NetCloseHook()
{
    DaemonFree(hUdp);
}

问题2:Net.c文件中定义了NetOpenHook函数和NetCloseHook函数,这两个函数是在哪里被调用的呢?
问题3:在NetOpenHook函数中调用的DaemonNew函数是在建立UDP通信前必须要使用的函数吗?
问题4:这个例程中UDP的接受程序是放在For(;;)中,是否意味着UDP接受是在不断地循环,也就是这个县城一直在执行没有中断?是否有建立在中断上的UDP通信,当服务器端要有信息发送,会触发中断,进而执行中断服务函数(将recvnfrom设置为中断服务函数)。与无限循环的接受数据相比,这种中断的方式会不会效率更高一些?
问题5:在UDP这个历程中共有3个.c文件,这样的目的是更加条理吗?还是有什么其他的开发惯例?可不可以直接将Net.c和UDP.c的函数直接放到main.c中?
希望前辈或者工程师能指点,不胜感激!




作者: 希望缄默    时间: 2017-3-22 14:36
1、NSP
2、NDK 初始化的时候和 NDK 结束的时候 例程是静态配置 NDK 所以 NDK 不会结束
3、不是 你可以理解为监听一个 UDP 端口 创建一个监听线程
4、网络底层驱动是中断+队列的 这里的无线循环是代表一个任务线程 不是查询的意思
5、是为了更有调理 可以放到一起的
作者: tengfei    时间: 2017-3-22 16:12
希望缄默 发表于 2017-3-22 14:36
1、NSP
2、NDK 初始化的时候和 NDK 结束的时候 例程是静态配置 NDK 所以 NDK 不会结束
3、不是 你可以理解 ...

谢谢您的指点!关于NDK和NSP的相关内容在创龙的时频中有讲解吗?第三个问题是不是可以理解为创建监听线程是必须要有的,而创建监听线程可以通过其他方式而不一定是daemonnew这个函数进行?第四个问题还不是很了解您的意思,能说的详细点吗,谢谢!
作者: 希望缄默    时间: 2017-3-23 08:51
tengfei 发表于 2017-3-22 16:12
谢谢您的指点!关于NDK和NSP的相关内容在创龙的时频中有讲解吗?第三个问题是不是可以理解为创建监听线程 ...

以后会有
不是 创建监听线程必须要用 DaemonNew 但是 UDP 通信不是必须
操作系统都是分层的 网络是肯定用到中断的 你可以看看 SYS/BIOS 的视频教程
作者: tengfei    时间: 2017-3-25 09:36
希望缄默 发表于 2017-3-23 08:51
以后会有
不是 创建监听线程必须要用 DaemonNew 但是 UDP 通信不是必须
操作系统都是分层的 网络是肯定用 ...

谢谢您!由于刚开始上手DSP,以前并没有什么基础,创龙的视频教程也看了一遍但是当时并不是带着问题看得感觉过后忘得很快。比如就像问题中NSP和NDK调用的这些函数。假如我自己写UDP通信的话我是不知道具体在开头初始化哪些东西,这些函数在什么时候被调用。操作系统的各层也不是很了解。对于初学6748这块开发板,除了视频教程外,您能给点什么其他的学习建议吗?感觉现在是无从下手。假如您能指导一下,不胜感激!
作者: shayingzhe    时间: 2020-12-8 22:57
您好,请问您实现了用硬件中断收发报文了吗?




欢迎光临 嵌入式开发者社区 (https://51dsp.net/) Powered by Discuz! X3.4