ZYNQ7020与PC机的UDP通信实现

2023-05-16

 由于实验室项目需求开始学习ZYNQ7000系列开发板,了解zunq的udp通信实现,开发板的自带学习资料有 基于UDP的QSPI Flash bin文件网络烧写实验,该实验的基本原理如下:

首先,在 ZYNQ 的 ARM 中基于 LWIP 库建立一个 UDP,板卡通过网线与电脑连接。脑中通过网络调试助手以 UDP 模式与 ZYNQ 建立 UDP连接。然后,通过络调试助手将 BOOT.bin 文件以二进制形式发送至 ps端,并存储在 ZYNQ 所连接的 DDR 中。最后,当 ps端接收完 bin 文件所有的数据后,网络调试助手发送烧写启动命令,将 bin 文件的数据按顺序一一连续写入 QSPI Flash 中,随后再全部读出与所接收的 bin 文件进行一一比对检验。断电重启板卡,便可验证 bin 文件的更新。

由于我们的最终目的是在pc机上的上位机与zynq实现udp通信并互相发送指令和我们需要的数据,因此在原实验代码的基础上需要做出相应的改动,在此我们将代码改为:zynq的ps端和pc机建立udp连接之后,pc机发送“ start update"指令,zynq接收指令后向pc机发送10000字节大小的数据,(我们只是为了验证两者之间可以成功通信,至于发送的内容可以自己定义),每次发送1024字节,pc机接收数据后打印接收数据的大小,最后打印出所有数据的内容。

zynq端ps部分的相关代码:

/* udp_transmission.c
 *
 * Created on: 2017Äê1ÔÂ22ÈÕ
 * www.osrc.cn
 * www.milinker.com
 * copyright by nan jin mi lian dian zi www.osrc.cn
*/


#include <stdio.h>
#include <string.h>

#include "lwip/err.h"
#include "lwip/udp.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "xqspips.h"
#include "xil_cache.h"
#include "xil_printf.h"
#include "sleep.h"
#include "udp_transmission.h"
#include "qspi_g128_flash.h"


#define FILE_BASE_ADDR        0x10000000
#define READ_BASE_ADDR        0x11000000
#define WRITE_BASE_ADDR        0x12000000

struct udp_pcb *connected_pcb = NULL;
static struct pbuf *pbuf_to_be_sent = NULL;

static unsigned local_port = 5010;    /* server port */
static unsigned remote_port = 7;
volatile u32 file_length = 0;

u8 *file;
u8 *read_buffer;
u8 *write_buffer;

void udp_recv_callback(void *arg, struct udp_pcb *tpcb,
                               struct pbuf *p, struct ip_addr *addr, u16_t port)
{

    struct pbuf *q;
    u32 remain_length;

    q = p;
    xil_printf("get data:%s\r\n",(char *)q->payload);

    if(q->tot_len == 12 && (!strcmp("start update", (char *)q->payload)))
    {
        xil_printf("flash update start!\r\n");
        xil_printf("file length of BOOT.bin is %d Bytes\r\n", file_length);

        pbuf_free(p);
//create an image that the size is 100*100
        u8 *img = NULL;
        img = (u8 *) malloc(sizeof(u8) * 10000);
        for(int i = 0; i < 10000; i++)
        {
            if(i < 5000)
                img[i] = 2;
            if(i > 5000)
                img[i] = 1;
        }

        udp_send_data(img,10000);

        //udp_printf("flash update start!\r\n");
        /*update flash*/
        update_flash(file, read_buffer, write_buffer, file_length);
    }
    else
    {
        /*if received ip fragment packets*/
        if(q->tot_len > q->len)
        {
            remain_length = q->tot_len;
            while(remain_length > 0)
            {
                memcpy(file + file_length, q->payload, q->len);

                file_length += q->len;
                remain_length -= q->len;
                /*go to next pbuf pointer*/
                q = q->next;
            }
        }
        /*if received no ip fragment packets*/
        else
        {
            memcpy(file + file_length, q->payload, q->len);
            file_length += q->len;
        }

        //xil_printf("udp data come in!%d, %d\r\n", p->tot_len, p->len);

        pbuf_free(p);
    }

    return;
}

*int udp_recv_init()
{
    struct udp_pcb *pcb;
    struct ip_addr ipaddr;
    err_t err;

    file = (u8 *)FILE_BASE_ADDR;
    read_buffer = (u8 *)READ_BASE_ADDR;
    write_buffer = (u8 *)WRITE_BASE_ADDR;

    /* create new UDP PCB structure */
    pcb = udp_new();
    if (!pcb) {
        xil_printf("Error creating PCB. Out of Memory\r\n");
        return -1;
    }

    /* bind to local port */
    err = udp_bind(pcb, IP_ADDR_ANY, local_port);
    if (err != ERR_OK) {
        xil_printf("udp_recv_init: Unable to bind to port %d: err = %d\r\n", local_port, err);
        return -2;
    }

  IP4_ADDR(&ipaddr,  192, 168,  1, 100);
    err = udp_connect(pcb, &ipaddr, remote_port);
    if (err != ERR_OK)
        xil_printf("error on udp_connect: %x\n\r", err);

    udp_recv(pcb, udp_recv_callback, NULL);

    connected_pcb = pcb;

    return 0;
}

void udp_printf(const char8 *ctrl1)
{
    char * message;
    u16 length;
    int i;
    err_t err;
    struct udp_pcb *tpcb = connected_pcb;

    if (!tpcb)
    {
        xil_printf("error return\r\n");
        return;
    }

    message = (char *)ctrl1;

    i = 0;

    while(!(message[i] == '\n'))
    {
        i++;
    }

    length = i;

    /*make sure the shortest data is 18 bytes(because shortest ip packet is 46 bytes)*/
    if(length < 18)
    {
        pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 18, PBUF_POOL);
        memset(pbuf_to_be_sent->payload, 0, 18);
    }
    else
    {
        pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, length, PBUF_POOL);
    }

    memcpy(pbuf_to_be_sent->payload, (u8 *)message, length);

    err = udp_send(tpcb, pbuf_to_be_sent);
    if (err != ERR_OK)
    {
        xil_printf("Error on udp_send: %d\r\n", err);
        pbuf_free(pbuf_to_be_sent);
        return;
    }
    pbuf_free(pbuf_to_be_sent);

}


void udp_send_data(const u8 *ctrl1, int length)
{
    const u8 * message;
    //u16 length;
    //int i;
    err_t err;
    struct udp_pcb *tpcb = connected_pcb;

    if (!tpcb)
    {
        xil_printf("error return\r\n");
        return;
    }

    message = ctrl1;

//    i = 0;

//    while(!(message[i] == '\n'))
//    {
//        i++;
//    }

//    length = i;

    /*make sure the shortest data is 18 bytes(because shortest ip packet is 46 bytes)*/
    xil_printf("start send data\r\n");
    while(length>0)
    {
        xil_printf("length: %d\r\n", length);
//        if(length < 18)
//        {
//            pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 16, PBUF_POOL);
//            memset(pbuf_to_be_sent->payload, 0, 16);
//
//        }
//        else
//        {
            if(length >= 1024)
            {
                pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 1024, PBUF_POOL);
                memcpy(pbuf_to_be_sent->payload, message, 1024);
                message += 1024;
            }
            else
            {
                pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT,length, PBUF_POOL);
                memcpy(pbuf_to_be_sent->payload, message, length);
                message += length;
            }
        //}


        //message += length;

        err = udp_send(tpcb, pbuf_to_be_sent);
        //sleep(3000);
        if (err != ERR_OK)
        {
            xil_printf("Error on udp_send: %d\r\n", err);
            pbuf_free(pbuf_to_be_sent);
            return;
        }

        length -= 1024;
        //sleep(3);
    }
    pbuf_free(pbuf_to_be_sent);

}

**************************************************************分割线***************

main.c


/*
 *
 * www.osrc.cn
 * www.milinker.com
 * copyright by nan jin mi lian dian zi www.osrc.cn
 *
 *
*/

 

#include "sys_intr.h"
#include "qspi_g128_flash.h"
#include "xqspips.h"
#include "lwip/err.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "lwipopts.h"
#include "xil_cache.h"
#include "udp_transmission.h"


static  XScuGic Intc; //GIC
XQspiPs QspiInstance;


#define QSPI_DEVICE_ID        XPAR_XQSPIPS_0_DEVICE_ID

extern void lwip_init(void);

void init_intr_sys(void)
{
    Init_Intr_System(&Intc); // initial interrupt system
    Setup_Intr_Exception(&Intc);
}

int main(void)
{

    int Status;
    struct netif *netif, server_netif;
    struct ip_addr ipaddr, netmask, gw;

    /* the mac address of the board. this should be unique per board */
    unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };

    /* Flush the Data Cache*/
    Xil_DCacheFlush();

    /* Disable Data Cache */
    Xil_DCacheDisable();

//    Xil_DCacheEnable();

    Status = Init_qspi(&QspiInstance, QSPI_DEVICE_ID);
    if (Status != XST_SUCCESS) {
        xil_printf("QSPI init Failed\r\n");
        return XST_FAILURE;
    }

    init_intr_sys();

    netif = &server_netif;

    IP4_ADDR(&ipaddr,  192, 168,   1,  10);
    IP4_ADDR(&netmask, 255, 255, 255,  0);
    IP4_ADDR(&gw,      192, 168,   1,  1);

    /*lwip library init*/
    lwip_init();
    /* Add network interface to the netif_list, and set it as default */
    if (!xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, XPAR_XEMACPS_0_BASEADDR)) {
        xil_printf("Error adding N/W interface\r\n");
        return -1;
    }
    netif_set_default(netif);

    /* specify that the network if is up */
    netif_set_up(netif);

    /* initialize tcp pcb */
    udp_recv_init();
    xil_printf("udp_start\r\n");

    while (1)
    {

        /*receive input packet from emac*/
        xemacif_input(netif);//将MAC队列里的packets传输到你的LwIP/IP stack里
    }
    return 0;

}

 

PC端的代码(环境是vs2013)

#define _CRT_SECURE_NO_WARNINGS
#include <opencv2\highgui\highgui.hpp>
#include <stdio.h>
#include <winsock2.h>
#include <conio.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib") 

using
namespace  cv;

using
namespace  std;

 


int main(int argc, char* argv[])
{

    int serlen = 0;
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 2);
    if (WSAStartup(sockVersion, &wsaData) != 0)
    {
        return 0;
    }

    SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (serSocket == INVALID_SOCKET)
    {
        printf("socket error !");
        return 0;
    }

    //SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    //if (sclient == INVALID_SOCKET)
    //{
    //    printf("socket error !");
    //    return 0;
    //}

    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(7);
    serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.100");//pc de ip
    int ser_len = sizeof(serAddr);
    if (bind(serSocket, (sockaddr *)&serAddr, ser_len) == SOCKET_ERROR)
    {
        printf("bind error !");
        closesocket(serSocket);
        return 0;
    }

    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(5010);
    sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.10");//板子的ip
    //sin.
    int len = sizeof(sin);
    char sendData[] = "start update";
    
    //sendto(sclient, sendData, 4, 0, (sockaddr *)&sin, len);
    char recvData[1024] = { 0 };

    unsigned char *r_data = NULL;
    r_data = (unsigned char *)malloc(sizeof(unsigned char) * 10000);
    memset(r_data, 0, 10000);

        sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);
        int r_data_len=0;
        while (r_data_len < 10000)
        {
            int ret = recvfrom(serSocket, recvData, 1024, 0, (sockaddr *)&sin, &len);
            for (int i = 0; i < ret; i++)
            {
                //putchar(r_data[i]);
                printf("%d", (int)recvData[i]);
            }
            //printf("接受到一个连接:%s \r\n", inet_ntoa(sin.sin_addr));
            printf("已接收到的数据长度为:%d 字节\n", r_data_len);
            memcpy(r_data + r_data_len, recvData, ret);
            r_data_len += ret;
            
        }
        //printf("收到的数据是:%s ", *r_data);
        printf("接收到的数据长度为:%d字节\n ", r_data_len);
        for (int i = 0; i < 10000; i++)
        {
            //putchar(r_data[i]);
            printf("%d",(int)r_data[i]);
        }


    closesocket(serSocket); 
    WSACleanup();
    getchar();
    return 0;
}

本实验中zynq的ps端的ip地址为192.168.1.10 端口号为5010,pc端的ip地址为192.168.1.100,端口号为7。

本实验比较简单,后期需要将pl端的图像数据通过DMA方式传给ps的DDR中,然后通过网络传给上位机中并进行算法的实现。

希望也在做相关工作的小伙伴能够一起交流学习。


 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZYNQ7020与PC机的UDP通信实现 的相关文章

  • 是否可以在 socket.io 中使用 UDP?

    我正在开发一款游戏 听说 UDP 更适合实时游戏 我知道 socket io 使用 TCP 并且想知道是否有某种方法可以将其切换到 UDP 我尝试查找它 但只找到了 2012 年左右的帖子 其中说 UDP 仅在浏览器中处于实验阶段 从标准浏
  • 对 C# 中 UDP 协议的套接字感到困惑

    我刚刚开始通过各种 Google 搜索学习套接字 但在弄清楚如何在 C 中正确使用套接字时遇到一些问题 我需要一些帮助 我有一个测试应用程序 Windows 窗体 和一个不同的类 实际上在它自己的 dll 中 但这无关紧要 我有我的套接字代
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • UdpClient 在广播地址上接收

    在 c 中 我使用 UdpClient Receive 函数 public void StartUdpListener Object state try udpServer new UdpClient new IPEndPoint IPAd
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一
  • 更改Windows下的默认套接字缓冲区大小[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我无法更改的应用程序正在丢弃一些传入的 UDP 数据包 我怀疑接收缓冲区溢出 是否有注册表设置可以使默认缓冲区大于 8KB From th
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • C# 广播是UDP消息,监听多个回复

    我正在尝试编写一些执行 UDP 广播的代码 然后侦听来自远程服务器的答复 说明它们存在 它用于识别子网上运行服务器应用程序的计算机 因此基本上会发出 谁在那儿 并听取所有答复 我在 Java 中有这个 工作完美 它将 DatagramPac
  • netty 4.x.x 中的 UDP 广播

    我们需要使用 Netty 4 0 0 二进制文件通过 UDP 通道广播对象 Pojo 在 Netty 4 0 0 中 它允许我们仅使用 DatagramPacket 类来发送 UDP 数据包 此类仅接受 ByteBuf 作为参数 还有其他方
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 在 macOS 10.12 上绑定到套接字时出现 NSPOSIXErrorDomain

    我正在玩CocoaAsyncSocket https github com robbiehanson CocoaAsyncSocket在 Swift 中绑定到 UDP 套接字并通过本地网络接收消息 我正在初始化一个套接字 并尝试绑定到一个端
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 使用 Boost.Asio 进行广播的问题

    如果问题之前已得到解答 我提前表示歉意 但我已经搜索并没有找到任何对我有帮助的东西 正如问题标题所示 我正在尝试将包从服务器广播到一组侦听任何消息的客户端 客户端将计算一秒钟内收到的消息数 服务器端的事情是这样的 class Server
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到

随机推荐

  • 字符串的截取、分割,截取指定字符前面(后面)所有字符

    关于字符串截取问题 xff0c 从网上搜到总结一下 xff1a 已知一个字符串 xff0c 截取第一个指定字符后面所有字符 首先得知道indexof 34 34 的用法 xff0c 例如String i 61 abcdefg xff0c 那
  • [资料分享] 好赢60A无刷电调设置说明书【详细】

    完全针对车模而设计的全新程序算法 xff0c 具有优异的启动效果 加速性能 刹车性能及线性度 xff1b 支持所有无感 xff08 即无霍尔传感器 xff09 无刷电机 xff1b 高品质用料 xff0c 具有强大的耐电流能力 xff1b
  • 单片机学习笔记 —— 串口通信原理

    一 串口通信电路 电路图 xff1a 说明 xff1a 当RXD TXD为低电平时 xff0c 对应的led灯会亮起 二 串口通信控制寄存器 下图为80C51串行口的结构 xff1a SCON serial Control Register
  • 四种方法计算字符串的长度

    在这里我提供四种方法计算字符串的长度 1 使用递归函数 2 数数 xff0c 从第一个字符开始数数 xff0c 没遇到一个字符 xff0c 长度加一 xff0c 直到遇到 34 0 34 停止数数 3 使用strlen函数 xff0c 使用
  • 汉诺塔问题—C语言实现

    一 题目描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 把A杆上的金
  • linux三大剑客

    awk是一种很棒的语言 xff0c 适合文本处理和报表生成 使用方法 awk pattern 43 action filenames 尽管操作可能会很复杂 xff0c 但是语法总是这样 xff0c 其中pattern表示AWK再数据中查找的
  • 数据结构与算法之栈

    目录 顺序栈 xff1a 链式栈 xff1a 栈的使用 xff1a 首先 xff1a 栈是一个特殊的线性表 xff0c 只允许在一端进行插入 xff08 压栈 xff09 和删除元素 xff08 进栈 xff09 xff0c 这一端称为栈顶
  • 二叉树的典型习题总结

    二叉树的三种遍历方式 xff1a 1 给定一个二叉树 xff0c 返回它的前序遍历 root left right 递归实现 xff1a public List lt Integer gt preorderTraversal TreeNod
  • javascript简介及基本语法

    这两天了解到一门新的脚本语言 javascript xff0c 貌似能干的事情好多呀哈哈哈哈 xff0c 言归正传啧 目录 javascript简介 js的简介 js的特点 javascript和java的区别 javascript的组成
  • Postman~做接口测试

    在工作中 xff0c 接口测试势必是最有效的测试途径 因此 xff0c 学习接口测试的基础和工具是很有必要的 xff0c 从Postman开始吧 xff5e 目录 1 接口测试简介 2 接口测试流程及用例设计 3 使用Postman执行接口
  • pytest接口测试自动化框架

    目录 pytest简介及安装 pytest的使用规则 pytest运行方式 主函数方式 命令行方式 跳过 标记及预期失败特殊场景处理 pytest前后置 夹具 pytest高级用法fixture pytest接口断言 pytest结合all
  • 测试的阶段性小小总结

    转眼入职2年之余 xff0c 毕业后就投入测试行业 在日常的工作中也有自己的一些思考和总结 2021到2023是多变的两年 xff0c 加入教培行业 xff0c 受双减政策影响 xff0c 注定艰难 参与了各种类型的测试项目 xff0c 不
  • 关于Charles抓包

    目录 抓包的原理 抓包的步骤 1 下载Charles 2 PC抓HTTPS协议的包 3 移动端抓包步骤 证书的原理 抓包的原理 抓包的软件非常多 xff0c 其实底层逻辑充当了一个中间人代理的角色来对HTTPS进行抓包 xff0c 结合日常
  • Ubuntu下使用CMakeLists.txt管理C/C++代码

    Ubuntu下使用CMakeLists txt管理C C 43 43 代码 一 CMakeLists txt入门知识1 CMakeLists txt的编译方法2 CMakeLists txt的文件内容3 编译的C文件 二 CMakeList
  • C语言中的__FILE__、__LINE__和__func__等预定义宏和注意事项

    C语言预处理要求定义某些对象宏 xff0c 运用这些预定义宏能使调试变得更简单 xff0c 每个预定义宏的名称一两个下划线字符开头和结尾 xff0c 这些预定义宏不能被取消定义 xff08 undef xff09 或由编程人员重新定义 常用
  • 树莓派4B ubuntu20.04 安装ROS noetic和opencv记录

    文章目录 准备换源安装ROS一些遇到的坑连接wifi添加秘钥时出错 E could not get lock var lib apt list catkin make时出现错误 Could not find the required com
  • c语言变量和常量

    c语言的常量和变量及其类型 常量以及常量的定义 变量 xff1a 在c语言中变量就是能够改变的量 常量 xff1a 就是在定义后不能去改变的值就是常量 int a 61 10 a 61 20 此时的a就是一个变量 const int a 6
  • 头文件中只有声明,没有定义

    前言 xff1a 头文件中只有声明 xff0c 而没有定义 这是为什么呢 xff1f 刚看到这个问题我也比较纳闷 因为我学C 43 43 之前一直是这样的 xff0c 直到学习了C 43 43 中的内联函数 xff0c 内联函数的声明和定义
  • STM32-printf重定向串口输出

    声明 本文内容转载至https www mculover666 cn posts 2251182441 1 printf与fputc printf 定义在 lt stdio h gt 头文件中 xff0c 如下 xff1a span cla
  • ZYNQ7020与PC机的UDP通信实现

    由于实验室项目需求开始学习ZYNQ7000系列开发板 xff0c 了解zunq的udp通信实现 xff0c 开发板的自带学习资料有 基于UDP的QSPI Flash bin文件网络烧写实验 xff0c 该实验的基本原理如下 首先 xff0c