目录

  • Change Log
  • 0 前言
    • 0.1 系统实现
    • 0.2 源码下载
    • 0.3 项目信息
  • 1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关
    • 1.1 系统框图
    • 1.2 RTL图
    • 1.3 Block Design
  • 2 ZYNQ开发板HDMI输出BMP图片功能:Linux相关
    • 2.1 Linux中对BMP图片的处理
      • 2.1.1 BMP图片数据读取
      • 2.1.2 BMP图片数据送入DDR内存
      • 2.1.3 调用
      • 2.1.4 VDMA配置
    • 2.2 挂载SD卡
      • 2.2.1 查看系统给SD卡分配的设备名
      • 2.2.2 挂载SD卡
      • 2.2.3 把图片放置在SD卡中
    • 2.3 使能以太网
      • 2.3.1 U-Boot
      • 2.3.2 Kernel
      • 2.3.3 设备树
      • 2.3.4 查看以太网连接情况
  • 3 BOA服务器+CGI程序实现的网页上传文件功能
    • 3.1 网页设计
    • 3.2 CGI程序设计
      • 3.2.1 构建BOA环境
      • 3.3.2 CGI程序
      • 3.3.3 CGI程序获取POST表单的输入
      • 3.3.4 CGI实现文件上传
    • 3.3 server.cgi程序
    • 3.4 upload.cgi程序
  • 4 系统运行
  • 总结

Change Log

2021年2月20日:首次发布。

0 前言

0.1 系统实现

本项目实现的功能为:网页上传BMP图片,ZYNQ开发板HDMI端口输出该BMP图片。
涉及到的方面有:1.网页设计;2.如何上传BMP图片到系统中;3.BMP图片如何通过HDMI显示出来。
本项目设计到前面文章提及过的启动镜像制作、读取BMP图片显示等内容,本项目不再进行详细说明。

  • 构建ZYNQ的Linux启动镜像
  • ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示
  • 利用Linux自动编译Vivado工程

下面将详细分几个章节说明完成这个实例的各项功能的实现方式:
1.ZYNQ开发板HDMI输出BMP图片功能:FPGA相关
2.ZYNQ开发板HDMI输出BMP图片功能:Linux相关
3.BOA服务器+CGI程序实现的网页上传文件功能

0.2 源码下载

进入github仓库下载
所有的代码包括在官方源码基础上改动的代码都在本地址提供的代码中。

0.3 项目信息

  • 工程名称:qynq07_sdp2hdmi
  • ZYNQ开发板型号:黑金ALINX AX7020
  • FPGA芯片型号:xc7z020clg400-2
  • FPGA编译工具:Vivado 2015.4
  • U-boot版本:xilinx-v2015.4,源码地址
  • Kernel版本:3.18.0-xilinx-gd627f5d-dirty,源码地址
  • 文件系统版本:arm_ramdisk.image.gz,源码地址
  • BOA服务器版本:boa-0.94.13,源码地址

1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关

此功能在文章ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示中已经有详细说明,本实例仍然采用相同的逻辑设计,下面只说明一些重点需要注意的地方。

1.1 系统框图

1.2 RTL图


RTL框图基本上跟系统框图是一样的,只是这里列出来便于理解。

1.3 Block Design


Block Design的话主要关注的是ZYNQ的配置及注意应用了1个VDMA模块。VDMA用来将DDR缓存里面的数据以AXI-Stream总线的形式读出来。在本实例中,VDMA负责把DDR缓存中的BMP图片数据读出来,以AXI-Stream总线的形式送到后级AXI-Stream转HDMI输出模块。VDMA使用起来非常简单,看一下Xilinx提供的使用手册pg020_axi_vdma熟悉即可,本实例不展开。
下图为VDMA及寄存器读写模块的物理地址,后面直接访问相应的地址就可访问到相应的模块。

ZYNQ使能的外设有SD(用来掉电不丢失储存Linux启动镜像及BMP图片),UART(用来打印Linux启动信息及调试),Ethernet(用于以太网连接实现网页访问)以及DDR控制器(用于访问外部的DDR3内存)。

2 ZYNQ开发板HDMI输出BMP图片功能:Linux相关

2.1 Linux中对BMP图片的处理

BmpRead.c代码中获取更多源码信息。

2.1.1 BMP图片数据读取

通过open函数打开文件,再通过read函数读取文件内容。

   fd = open(filename, O_RDONLY); // 以只读的方式打开文件(文件名为filename)ret = read(fd, bmpHdr, 64);    // 读取该文件前面64字节的数据,并赋值给bmpHdr

上面的代码为读取文件前面64字节的数据,作用是将BMP图片的头部信息抓取出来,然后查看BMP头部信息获取画面大小等信息。
以同样的方法可读取BMP图片的像素数据。

2.1.2 BMP图片数据送入DDR内存

通过memcpy函数将数据送入内存。

void * memcpy ( void * destination, const void * source, size_t num );

地址destination需要是mmap映射后的地址,不能是物理地址。

// 将frameBuf的数据送入memAddress起始的共BMP_HEIGHT*BMP_WIDTH字节的空间中。
memcpy(memAddress, (const void *)frameBuf, BMP_HEIGHT*BMP_WIDTH);

2.1.3 调用

qynq07_sdp2hdmi.c代码中获取更多源码信息。

frameBuf0Addr = xil_MMap(0x10000000, 0x600000); // 映射从0x10000000起始的共0x600000字节的空间
// 进入BmpRead函数,读取/mnt/init.bmp图片,并将该图片数据送入上面的映射地址起始的区域中。
BmpRead("/mnt/init.bmp", frameBuf0Addr);

在qynq07_sdp2hdmi.c中,我们一共读取了3张BMP图片,并送入了内存的3个区域,分别是:
1./mnt/init.bmp送入0x10000000中。
2./mnt/init_next.bmp送入0x10600000中。
3./mnt/user_bmp.bmp送入0x10C00000中。
init.bmp是保存在SD卡根目录的初始化图片,上电后系统就自动输入此初始化图片。
init_next.bmp用来调试BMP图片切换是否成功,根据0xA寄存器的[0]位来切换此图片或init.bmp。
user_bmp.bmp是用户在网页上上传的BMP图片,根据0xA寄存器的[1]位来切换此图片或init.bmp。

2.1.4 VDMA配置

VdmaConfig.c代码中获取更多源码信息。
上面说过,VDMA负责把DDR缓存中的BMP图片数据读出来,以AXI-Stream总线的形式送到后级AXI-Stream转HDMI输出模块。
我们将3张BMP图片放置在了内存的3个区域,我们只需要给VDMA配置该内存区域的起始地址,及画面大小即可,注意此地址是物理地址

// 读取0x10000000起始的BMP_WIDTH*BMP_HEIGHT字节的数据(对应init.bmp)
VdmaCfgRead(0, (u32)0x10000000, BMP_WIDTH, BMP_HEIGHT);

如果在VDMA配置的存储帧数为4,则需要使能4个dest。

2.2 挂载SD卡

上面说了在代码中如何读取BMP图片并送入内存中,但是在Linux中要读取SD卡里面的内容必须先挂载SD卡,本实例中将SD卡挂载到/mnt目录中。

2.2.1 查看系统给SD卡分配的设备名

cat proc/partitions
fdisk -l

如下图所示,在本实例中,mmcblk0是SD卡的设备名,mmcblk0p1是SD卡的第一个分区,本实例中SD卡我们只有1个分区。

2.2.2 挂载SD卡

mount /dev/mmcblk0p1 /mnt

2.2.3 把图片放置在SD卡中


查看/mnt文件夹内容,判断是否SD卡是否挂载成功以及BMP图片是否存在。

此时可以,SD卡挂载成功且图片已经在/mnt文件夹中了。

2.3 使能以太网

2.3.1 U-Boot

在u-boot-xlnx/configs/*_defconfig(本实例中为qynq_defconfig)中添加或修改如下配置

CONFIG_ZYNQ_GEM=y
CONFIG_NET_RANDOM_ETHADDR=y

2.3.2 Kernel

在/arch/arm/configs/*defconfig(本实例中为qynq_defconfig)中添加或修改如下配置

CONFIG_CFG80211=y
CONFIG_MAC80211=y
CONFIG_REALTEK_PHY=y
CONFIG_MICREL_PHY=y
CONFIG_DP83867_PHY=y
CONFIG_RTL8192CU=y

2.3.3 设备树

在设备树(本实例中为qynq.dts)中添加或修改如下内容

&gem0 {status = "okay";phy-mode = "rgmii-id";xlnx,ptp-enet-clock = <0x6750918>;phy-handle = <0x4>;mdio {#address-cells = <0x1>;#size-cells = <0x0>;phy@1 {compatible = "realtek,RTL8211E";device_type = "ethernet-phy";reg = <0x1>;linux,phandle = <0x4>;phandle = <0x4>;};};
};

2.3.4 查看以太网连接情况

ifconfig -a


连接网线,并设置IP。

ifconfig eth0 192.168.1.107

网络连接成功后打印link up的信息。

此时直接用ifconfig即可查看到以太网情况。

可以用用户名:root,密码:root来连接文件系统

用浏览器打开此IP即可进入初始的网页。

网页文件在这里

此网页是Xilinx在文件系统中设置的初始网页(我们用了Xilinx官方提供的文件系统arm_ramdisk.image.gz)。我们后面新做的网页也是放置在此文件夹并同样命名为index.html替换此初始网页。

3 BOA服务器+CGI程序实现的网页上传文件功能

3.1 网页设计

通过index.html与css文件一起可设计网页格式。
这里直接贴出网页index.html的设计代码,html的语法及如何设计在本实例中不详细说明。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title> QYNQ Development Board </title><link type="text/css" rel="stylesheet" href="css/main.css" /><script></script>
</head><body><img src="images/logo_v1.1.png"style="padding-left:30px"></img><div id="container">
<b class="rtop"><b class="r1"></b> <b class="r2"></b> <b class="r3"></b> <b class="r4"></b>
</b><h1>QYNQ Development Board</h1><h2> Toggle Unit LED </h2>
<iframe name ="server" style ="display:none;" src=' '> </iframe>
<form action="cgi-bin/server.cgi" method=POST target="server"><input type="submit" name="toggleLED" value="toggle LED"/>
</form><h2> Upload BMP picture for HDMI shows </h2>
<form action="cgi-bin/upload.cgi" method=POST enctype="multipart/form-data" target="_blank"><input type="file" name="file" value=""/><input type="submit" name="uploadFile" value="Upload"/>
</form><form action="cgi-bin/server.cgi" method=POST target="server"><input type="submit" name="swapBmp" value="Swap BMP"/>
</form><h2> External Links </h2>
<p>
<ul>
<li> <a href="https://github.com/qiweiii-git/qynq_task">Github Repository</a> </li>
</ul>
</p><b class="rbottom"><b class="r4"></b> <b class="r3"></b> <b class="r2"></b> <b class="r1"></b>
</b>
</div><script type="text/javascript" src="js/main.js"></script></body>
</html>

网页效果如下图所示:

在html代码中已经说明,点击toggle LED按钮以及Swap BMP按钮将调用server.cgi程序。点击Upload按钮将调用upload.cgi程序。下面会说明server.cgi程序及upload.cgi程序。

3.2 CGI程序设计

CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。
虽然BOA+CGI的方式有点古老了,但是用来实现一些小项目还是很方便的,因为非常简单易用。

3.2.1 构建BOA环境

首先我们需要在开发板中构建BOA环境,这样才能运行cgi程序。
BOA服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。
参考下面这个博文获取更多构建信息,但是我们要应用到ZYNQ中的话不能完全照搬这个文章。下面我会说明。
https://blog.csdn.net/weixin_34080951/article/details/92183138
1.修改boa-0.94.13/src目录下的boa.c源文件,大概在225行,注释掉如下语句:

if (setuid(0) != -1){DIE("icky Linux kernel bug!");
}

2.修改boa-0.94.13/src目录下的compat.h头文件,大概在120行,修改如下:
将foo##->tm_gmtoff中的##去掉。
3.进入boa-0.94.13,直接运行src/configure文件。
4.修改boa-0.94.13/src目录下的Makefile文件,修改如下:

将CC = gcc修改为CC = arm-xilinx-linux-gnueabi-gcc
将CPP = gcc -E 修改为CPP = arm-xilinx-linux-gnueabi-gcc -E

5.运行make。
6.将在boa-0.94.13/目录下的boa.conf文件拷贝到开发板/etc/boa目录下;
7.将mime.types文件拷贝到开发板/etc目录下;
8.将boa-0.94.13/src目录下的boa拷贝到开发板/bin目录下(或其他默认系统路径);
9.修改开发板中的boa.conf文件

①修改48行:User nobody 为 User root
修改48行:User group 为  User root
②修改193行:ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 为 ScriptAlias /cgi-bin/  /var/www/cgi-bin/

至此,开发板中的boa服务器环境已搭建完毕。

3.3.2 CGI程序

cgi程序实际上就是c程序,运行在boa服务器上,编译方法与普通c程序也是一样的,也可以在linux中直接运行。
通过html中的<form action="cgi-bin/server.cgi"即可实现在网页提交表单后,进入相应的cgi程序(放在boa服务器的/var/www/cgi-bin目录下),而通常情况下,进入cgi程序会打开另一个网页,如果想要在boa服务器调用cgi程序时,网页页面不发生跳转,可加入<iframe来实现。

< iframe name ="server" style ="display:none;" src=' '> </iframe>
< form action ="应用程序路径" method ="POST" target ="server" >
......
</form>

3.3.3 CGI程序获取POST表单的输入

在网页点击了提交按钮后,即我们设计的网页中的toggle LED按钮,Upoad按钮及Swap BMP按钮,进入CGI程序时,会带入表单数据,而在CGI程序中想要获取表单的数据,可通过如下方式:

poststr=getenv("CONTENT_LENGTH");
len=atoi(poststr);
fgets(inputdata,len+2,stdin);
sscanf(inputdata,"toggleLED=%[^&]&toggle=%[^&]", toggleLED, toggle);

这样就能获取到toggle LED按钮被点击后的,toggleLED及toggle这两个名称的数值。上面代码只是获取toggle LED按钮被点击后的表单一个例子。

3.3.4 CGI实现文件上传

参考如下博文。
https://blog.csdn.net/u010411897/article/details/13983701?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
CGI实现文件上传需要用到CGIC库(实际上就是cgic.c和cgic.h两个文件)。
在下面的链接地址中可获取cgic.c和cgic.h这两个文件
https://github.com/qiweiii-git/cgic
需要注意的是,使用cgic库后,需要把我们自己的cgi程序的主函数更改为cgiMain
并且需要在HTML中添加enctype="multipart/form-data",否则无法获取文件名。
cgi程序源码如下:

   // 取得html页面中file元素的值,应该是文件在客户机上的路径名if(cgiFormFileName("file", name, sizeof(name)) != cgiFormSuccess){printf("could not get filename. \r\n");goto FAIL;}// 打开文件if (cgiFormFileOpen("file", &file) != cgiFormSuccess) {printf("could not open the file. \r\n");goto FAIL;}// 在fileNameOnServer目录下建立新的文件targetFile = open(fileNameOnServer, O_RDWR|O_CREAT|O_TRUNC|O_APPEND, mode);if(targetFile < 0){printf("could not create the file %s. \r\n", fileNameOnServer);goto FAIL;}// 从系统临时文件中读出文件内容,并放到刚创建的目标文件中while(cgiFormFileRead(file, buffer, BufferLen, &got) == cgiFormSuccess){if(got > 0)write(targetFile, buffer, got);}

3.3 server.cgi程序

下面贴出server.cgi的程序代码

int main(void)
{int fd;int len;char *postStr,inputData[512];int funcSel = 0;fd = open("/dev/mem", O_RDWR | O_SYNC);if (fd < 0){printf("Cannot open /dev/mem. \n");exit(1);}m_MapAddress = mmap(0, 0x2000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (__off_t)REGCTRL_BASEADDR);if(m_MapAddress == (void *) -1){printf("Can't map the 0x%x to the user space. \n", REGCTRL_BASEADDR);}// Get the value from FORMpostStr=getenv("CONTENT_LENGTH");if(postStr != NULL){len=atoi(postStr);fgets(inputData,len+2,stdin);if(strstr(inputData, "toggle")){//sscanf(inputdata,"toggleLED=%[^&]&toggle=%[^&]", toggleLED, toggle);funcSel = 1;}else if(strstr(inputData, "swap")){funcSel = 2;}}// Swap LED statusif(funcSel == 1){SwapLed();}else if(funcSel == 2){SwapBmp();}munmap(m_MapAddress, 0x2000);return 0;
}

我们首先映射了寄存器访问地址(0x41000000即Block Design中的寄存器访问模块的地址),用于寄存器访问,因为上面说到了,0xA寄存器的[1]位用来切换user_bmp.bmp即init.bmp,我们直接修改0xA寄存器的[1]位就可以切换HDMI输出的BMP图片了。映射了寄存器访问地址后,我们根据输入的表单信息,提取得到用户点击了toggle LED还是Swap BMP,并进入不同的函数控制,非常简单。

3.4 upload.cgi程序

下面贴出upload.cgi的程序代码

int cgiMain(void)
{cgiFilePtr file;int targetFile;mode_t mode;char name[128];char fileNameOnServer[64];char contentType[1024];char buffer[BufferLen];char *tmpStr=NULL;int size;int got;// 输出HTML头部(声明文档类型)printf("Content-Type:text/html;\r\n\r\n");printf("<html><body>\r\n");// 取得html页面中file元素的值,应该是文件在客户机上的路径名if(cgiFormFileName("file", name, sizeof(name)) != cgiFormSuccess){printf("could not get filename. \r\n");goto FAIL;}cgiFormFileSize("file", &size);// 取得文件类型cgiFormFileContentType("file", contentType, sizeof(contentType));// 打开文件if (cgiFormFileOpen("file", &file) != cgiFormSuccess){printf("could not open the file. \r\n");goto FAIL;}// 判断文件是否是BMP图片if(strstr(name, ".bmp")){strcpy(fileNameOnServer, "/mnt/user_bmp.bmp");}else{goto FAIL;}mode = S_IRWXU|S_IRGRP|S_IROTH;// 在fileNameOnServer目录下建立新的文件targetFile = open(fileNameOnServer, O_RDWR|O_CREAT|O_TRUNC|O_APPEND, mode);if(targetFile < 0){printf("could not create the file %s. \r\n", fileNameOnServer);goto FAIL;}// 从系统临时文件中读出文件内容,并放到刚创建的目标文件中while(cgiFormFileRead(file, buffer, BufferLen, &got) == cgiFormSuccess){if(got > 0)write(targetFile, buffer, got);}cgiFormFileClose(file);close(targetFile);goto END;FAIL:printf("Failed to upload \r\n");printf("</body></html>");return 1;END:printf("File %s has been uploaded", fileNameOnServer);printf("</body></html>");return 0;
}

这段代码的功能实际上就是获取用户上传的BMP图片数据,并保存为/mnt/user_bmp.bmp,期间进行了一些状态判断。

4 系统运行

我们把ZYNQ的Linux启动镜像init.bmpinit_next.bmp文件放入内存卡中启动。

启动后UART的打印。

此时HDMI输出如下图所示(init.bmp

进入网页。

点击网页上的toggle LED来查看LED等是否控制正常。
点击网页昂的浏览上传另一张bmp图片。

点击网页上额Upload上传文件,此时会打开另一个网页显示上传情况。

如上图所示,图片上传成功。此时主要SD卡会多出user_bmp.bmp文件,这个就是用户上传的文件,而且这个文件会被下一次上传覆盖,即它永远是用户最近一次上传的文件。

点击网页上的Swap BMP
此时HDMI输出会切换成刚才上传的图片。

由此可见,系统运行正常。
如果此时再点击一次网页上的Swap BMP,HDMI就会切换输出为原来init.bmp图片。再点击一次,就会再次显示用户上传的这张图片。

总结

至此,本实例基于ZYNQ的网页上传BMP图片至HDMI端口输出实例已全部说明完毕,涉及到的东西比较多,由于篇幅问题,无法全部都详细说明,但一些关键的实现原理和全部的源码都有提供,通过源码来加深理解会是一个更好的方式。虽然诸如boa+cgi这样的网页控制方式比较过时,但确实是实现这个网页上传BMP图片至HDMI端口输出功能比较简单易用的方法。后续我会寻找更加现代化的网页控制方式以及更加现代化的应用场景,本实例则到此结束。

基于ZYNQ的网页上传BMP图片至HDMI端口输出实例相关推荐

  1. C语言绘制立体窗口,制作立体风格网页上传窗口图片的PS教程

    各种各样的对话框,对于我们来说,太常见了.发微博和在网站上上传图片,我们都会遇到图片上传的对话框.今天,参考了网上的一个图片,我们制作了一个超级简单的图片上传对话框. 本教程主要使用Photoshop ...

  2. 织梦php版本图片不能上传,让dedecms织梦后台支持上传bmp格式的图片的教程

    在后台-系统-附件设置,里面添加了bmp,上传bmp格式图片系统还是会提示你"文件类型不正确!",那么有什么好的解决方法呢,请看下文. 1.后台-系统-附件设置,添加bmp 2.i ...

  3. SE78上传BMP格式图片出错,出错信息提示上传的不是BMP格式图片

    如下图,导入文件为一BMP图片(红框部分), 然后点击确认键(黑框部分). 结果却出错,提示不是BMP文件,如下图红框部分. 很纳闷明明是BMP怎么就提示说不是BMP呢?感觉应该是上传的图片有问题,所 ...

  4. php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...

    本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...

  5. MVCWebForm对照学习:文件上传(以图片为例)

    MVC&WebForm对照学习:文件上传(以图片为例) 在web应用中,文件上传是个很普遍的功能,那么今天就来小结一下asp.net中文件上传的方式.首先我们快速来回忆一下WebForm中的文 ...

  6. 多个ajaxFileUpload上传图片与ajax合用,解决同步问题,用户随意上传多少图片都可以;

    需求描述:因ajaxFileUpload 文件上传插件是异步请求,但是业务上需要先得到 ajaxFileUpload 请求后的图片url, 在通过ajax 把图片URL等其它需要录入的数据一并写入数据 ...

  7. php上传虚假图片,解决PHP上传多个图片并校验的代码问题

    以下为引用的内容: // 图片目录 $img_dir = "../upload/"; // -- html 显示上传界面 /* 图片上传处理 */ // 把图片传到服务器 // 初 ...

  8. php图片上传功能,实时显示上传的图片

    工作中总会有需要自己写前端上传图片功能,特意保留一下自己感觉还好的前端上传图片代码 主要介绍了PHP上传图片显示缩略图功能代码, 前端html代码 <input type="hidde ...

  9. 使用Node.js express 开发上传文件/图片api接口

    我是傲夫靠斯,欢迎关注我的公众号[前端工程师的自我修养],每天更新. 今天我们来搞一个Node.js Express的上传文件功能,我使用了busboy这个库. Busboy是一个基于事件的文件流解析 ...

最新文章

  1. 想写游戏吗?手把手教你SDL的安装及配置(亲测有效!)
  2. Java:异常的概念及分类、异常的处理、异常抛出及自定义异常
  3. mysql汉字占几个字符_mysql和oracle的一个汉字占几个字符
  4. OPENCV-2 学习笔记
  5. oracle锁表会话超时时间,ORACLE快速彻底Kill掉的会话,防止锁表
  6. 方维分享系统,品牌无法设置分类关联
  7. Android画布和图形绘制---Canvas and Drawables(一)
  8. gnuplot画图命令_Gnuplot科学绘图(二十六)——image 绘图
  9. C语言中的面向对象2
  10. 计算机本地磁盘包括,电脑中系统文件夹和本地磁盘各是什么意思?又有什么不同?...
  11. C#webservice实例
  12. 《动手学深度学习》入门环境安装
  13. Donet Core中EFCore的DbFirst生成数据库实体
  14. 【学习笔记】数理统计习题十二
  15. OpenStreetMap地图服务器安装
  16. jsp使用session出现The server encountered an unexpected condition that prevented it from fulfilling the r
  17. python实例练习(12)身体质量指数BMI计算
  18. Video Caption
  19. nginx中deny和allow详解
  20. STM32中的程序在RAM还是FLASH里运行?

热门文章

  1. 计算机二级正确ip地址,计算机二级题中的ip地址是什么
  2. 闲置iPhone这么用
  3. 道路积水监测设备应用案例——积水点监测、立交积水监测、桥梁及隧道区域低洼区积水监测
  4. 深度学习入门之神经网络思维导图
  5. Deeply Learned Compositional Models for Human Pose Estimation
  6. 【车载开发】Android Automotive车载操作系统开发解密篇
  7. 测试开发工作者日记:2020.9.28
  8. 解决ceph 100.000% pgs not active
  9. 超市商品陈列原则口诀
  10. php调研方法,调研方法:定量研究