🌍首页
📁归档
⏳时光机
🚩友链
📫留言
📧订阅
🌟推荐
📕考研课程
🏜️ 免费壁纸
❤ 捐助本站
💰资助名单
🎵音乐实验
Search
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
20,378 阅读
2
论文写作中如何把word/wps里面所有数字和字母替换为新罗马字体
10,874 阅读
3
【高数】形心计算公式讲解大全
9,201 阅读
4
Vivado-FPGA Verilog烧写固化教程
8,300 阅读
5
【概论】一阶矩、二阶矩原点矩,中心矩区别与概念
7,979 阅读
🪶微语&随笔
励志美文
我的随笔
工作办公
📡电子&通信
嵌入式&系统
通信&信息处理
编程&脚本笔记
⌨️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
/
注册
Rs(共100篇)
找到
100
篇与
Rs
相关的结果
- 第 7 页
嵌入式视频流知识点及代码解析-精简版
摘要本文介绍了嵌入式视频流处理相关知识,包括Live555、FFmpeg、SDL等库的使用,以及RTSP、YUV、TCP/UDP等概念。通过代码解析,展示了如何实现视频流的接收、解码和显示。关键词:嵌入式视频流, Live555, FFmpeg, SDL, RTSP目录 背景和意义 框架 代码及相关知识点 一、知识点篇 二、问答篇 三、代码篇RTSP程序要不要等待播放器器程序请求? 请你找出上述代码所在位置 live555(了解) SDL 背景和意义 (1)视频的带宽很大,存储,传输不便,故要压缩、解压 、播放。 (2)应用领域很广 ,交通,在线教育,播放器,自动驾驶。 框架 图片 下面这个图及其重要以及3个ip关系 abcde代表先后实现顺序注意观看!!! TO67M8.png图片 代码及相关知识点 一、知识点篇 Live 555: 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了标准流媒体传输,对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer。 在本次开发实践中主要用于接收海康威视摄像头的RTP数据包 并通过UDP网络进行转发给PC机。 FFmpeg: Fmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 在本次开发实践中主要用于H264数据解码。 SDL: SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。在本次开发实践中主要用于YUV数据的显示。 二、问答篇 1.什么是YUV?与RGB有什么不同? YUV 是一种颜色编码方法,FFmpeg 解码后的数据格式。Y 表示明亮度 U 表示色 度 V 表示浓度。因为通过研究发现,人类对于图像的感知中对明亮最侧重,色彩和 浓度就相对不那么重要,所以在保存图片时,让明亮度占较多的比重,有效的在不影 响观看的情况下节约了空间。视频播放器解码出来的格式为 YUV420P,其中明亮度 占整个数据的 2/3,色度和浓度占 1/3。 2.RTSP在什么层?答:应用层 3.你关于IP问题你用到了那些命令?答:ipconfig,ifconfig,ping等 4.本次课程设计你用到了那些去年学的知识?答:网络通信,文件开关与读写,第一章shell操作命令 下面部分自行百度: 5.TCP与UDP特点(TCP的可靠,UDP 的不可靠,UDP快) 6.简述TCP与UDP 7.了解HTTP/https 8.三次握手和四次挥手过程 三、代码篇 RTSP程序要不要等待播放器器程序请求? 答:要 请你找出上述代码所在位置 答:如图所示 图片 live555(了解) BasicTaskScheduler 的父类是BasicTaskScheduler0 BasicTaskScheduler0是一个用作传递的类,它继承自TaskScheduler,又派生出BasicTaskScheduler。其定义在live555sourcecontrol\UsageEnvironment\include\BasicUsageEnvironment0.hh文件中。 BasicTaskScheduler0中有 BasicTaskScheduler 这个类主要实现事件的处理 BasicUsageEnvironment 涉及调试语句,输出语句 ourRTSPClient 主要是涉及的数据的发送相关的功能函数,主要的功能继承于父类RTSPClient RequestRecord 创建一个请求记录对象,并将回调函数与之关联 sendRequest 第一次进入调用:openConnection解析URL,并调用setupStreamSocket和connectToServer,然后 envir().taskScheduler().setBackgroundHandling(fInputSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, (TaskScheduler::BackgroundHandlerProc*)&incomingDataHandler, this); 若不是第一次调用,则打包 RTSP 包协议,并调用 Send函数发送到服务器。 重点 RequestRecord入队列 等候读取数据。 setupStreamSocket调用createSocket ,createSocket调用: sock = socket(AF_INET, type, 0); connectToServer调用 connect(socketNum, (struct sockaddr*) &remoteName, sizeof remoteName) setBackgroundHandling 主要初始化select 函数的 文件描述符集合 incomingDataHandler 中包含函数 readSocket 调用 int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0, (struct sockaddr*)&fromAddress, &addressSize);到此发送描述命令结束 ,等待响应服务器发送过来的数据。 incomingDataHandler1读取服务器的数据 incomingDataHandler1先调用readSocket调用,然后调用 handleResponseBytes 解析RTSP服务器数据 调用(*foundRequest->handler())(this, resultCode, resultString); 这个函数就是continueAfterDESCRIBE continueAfterDESCRIBE 调用下一步 setup 功能 SDL 抓1,2,3,4....等每段的关键句,可能考流程 rb为只读,对于不需要进行更新的文件,可以防止用户的错误的写回操作,防止损毁原有数据。具有较高的安全性。 rb+为更新二进制文件,可以读取,同时也可以写入,需要用到fseek之类的函数进行配合,以免出错,对于需要不时更新的文件,比如信息管理系统中的数据,可以这样打开。 初始化SDL 使用SDL_Init()初始化SDL。该函数可以确定希望激活的子系统。 int SDLCALL SDL_Init(Uint32 flags) SDL_INIT_VIDEO:视频 创建窗口(Window) 使用SDL_CreateWindow()创建一个用于视频播放的窗口。 SDL_Window SDLCALL SDL_CreateWindow(const char title,int x, int y, int w,int h, Uint32 flags); SDL_CreatWindow:第一个参数是窗口名字,第二三是窗口的坐标(SDL_winpos_undefined 为采用系统默认) title :窗口标题 x :窗口位置x坐标。也可以设置为SDL_WINDOWPOS_CENTERED或SDL_WINDOWPOS_UNDEFINED。 y :窗口位置y坐标。同上。 w :窗口的宽 h :窗口的高 flags :支持下列标识。包括了窗口的是否最大化、最小化,能否调整边界等等属性。 flags:SDL_WINDOW_RESIZABLE 自动调整窗口 基于窗口创建渲染器(Render) 使用SDL_CreateRenderer()基于窗口创建渲染器 SDL_Renderer SDLCALL SDL_CreateRenderer(SDL_Window window,int index, Uint32 flags); window: 渲染的目标窗口。 index:打算初始化的渲染设备的索引。设置“-1”则初始化默认的渲染设备。 SDL_RENDERER_PRESENTVSYNC:和显示器的刷新率同步 创建纹理(Texture) 使用SDL_CreateTexture()基于渲染器创建一个纹理 SDL_Texture SDLCALL SDL_CreateTexture(SDL_Renderer renderer,Uint32 format,int access, int w,int h); renderer:目标渲染器。 format:纹理的格式。 access:定义位于SDL_TextureAccess中 access:SDL_TEXTUREACCESS_STREAMING :变化频繁 w:纹理的宽 h:纹理的高 SDL_Thread *refresh_thread = SDL_CreateThread(RefreshVideo,NULL,NULL); //创建线程 SDL_Event event; //设置触发事件 6.在SDL中,当事件等待函数监听到事件后,判断事件类型,如果event.type == SDL_KEYDOWN,表明用户按下键盘,保存在event.key.keysym.sym是相应的键值。而根据键值,调用函数SDL_GetKeyName(event.key.keysym.sym)),即可得到按下的按键键名。 SDLK_RETURN == 13 回车! 7.读文件fread size_t fread(void buffer,size_t size,size_t count,FILE stream) buffer 是读取的数据存放的内存的指针(可以是数组,也可以是新开辟的空间,buffer就是一个索引) size 是每次读取的字节数 count 是读取次数 stream 是要读取的文件的指针 8.循环显示画面 (1)设置纹理的数据 使用SDL_UpdateTexture()设置纹理的像素数据 int SDLCALL SDL_UpdateTexture(SDL_Texture texture,const SDL_Rect rect,const void *pixels, int pitch); texture:目标纹理。 rect:更新像素的矩形区域。设置为NULL的时候更新整个区域。 pixels:像素数据。 pitch:一行像素数据的字节数。 (2)纹理复制给渲染目标 使用SDL_RenderCopy()将纹理数据复制给渲染目标。在使用SDL_RenderCopy()之前,可以使用SDL_RenderClear()先使用清空渲染目标。实际上视频播放的时候不使用SDL_RenderClear()也是可以的,因为视频的后一帧会完全覆盖前一帧 int SDLCALL SDL_RenderCopy(SDL_Renderer renderer,SDL_Texture texture,const SDL_Rect srcrect,const SDL_Rect dstrect); renderer:渲染目标。 texture:输入纹理。 srcrect:选择输入纹理的一块矩形区域作为输入。设置为NULL的时候整个纹理作为输入。 dstrect:选择渲染目标的一块矩形区域作为输出。设置为NULL的时候整个渲染目标作为输出。 (3) 显示 使用SDL_RenderPresent()显示画面 void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer); 参数renderer用于指定渲染目标 9.退出 event.type==SDL_QUIT fclose(fp); //关闭文件! 防止遗留无用进程 SDL_DestroyTexture(texture); //关闭纹理 SDL_DestroyRenderer(renderer); //关闭渲染 SDL_DestroyWindow(window); //关闭窗口 SDL_Quit(); //退出线程 FFMPEG解码deco fun_deco_display.c 从void * deco_thread开始 play_ubuntu内 功能函数于主函数同时编译 多个c编译! gcc -o demo main.c fun_deco_display.c fun_others.c fun_recv_control.c -I /monchickey/ffmpeg/include -L /monchickey/ffmpeg/lib -lavformat -lavcodec -lavutil -lSDL2 -lpthread AVCodec codec; / 解码CODEC*/ AVCodecContext *cctx; AVFrame frame; / 解码后的图像*/ int byte_buffer_size; //解码器码流长度 uint8_t *byte_buffer = NULL; //h.264码流 AVPacket *pkt; //保存媒体流信息 AVPacket主要保存一些媒体流的基本信息,例如PTS、DTS时间。最重要的当然就是媒体数据的buffer地址了。 比较重要的有: pts:控制显示的pts时间 dts:控制解码的dts时间 *data:媒体数据buffer的指针 duration:AVStream-> time_base单位中此数据包的持续时间,如果未知则为0。 在演示顺序中等于next_pts - this_pts。 AVFormatContext主要存储视音频封装格式中包含的信息 解码前数据:AVPacket 解码后数据:AVFrame 1.AVFormatContext avformat_alloc_context(void)函数用来申请AVFormatContext类型变量并初始化默认参数。申请的空间通过void avformat_free_context(AVFormatContext s)函数释放。 2.avformat_find_stream_info()主要用于给每个媒体流(音频/视频)的AVStream结构体赋值,已经实现了解码器的查找,解码器的打开,视音频帧的读取,视音频帧的解码等工作 3.av_find_best_stream()函数就是要获取音视频对应的stream_index 获取流的索引 4.解码模块第一步:获取解码器 avcodec_find_decoder()FFmpeg的解码器编码器都存在avcodec的结构体中 5.avcodec_alloc_context3,avcodec_parameters_to_context,解码器初始化 6.avcodec_open2打开解码器 7.av_frame_alloc()首先调用av_mallocz()为AVFrame结构体分配内存 8.int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小,av_malloc 按需分配空间 9.av_packet_alloc实际是分配AVPacket以后,调用av_init_packet对AVPacket的成员变量进行初始化赋值 10.av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧 11.avcodec_send_packet()以在AVPacket中给出解码器原始的压缩数据 avcodec_receive_frame()。 成功后,它将返回一个包含未压缩音频或视频数据的 AVFrame 12. void av_image_copy_uc_from ( uint8_t * dst_data[4], const ptrdiff_t dst_linesizes[4], const uint8_t * src_data[4], const ptrdiff_t src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height ) 数据拷贝 13.av_packet_free(&pkt); //释放数据 关闭进程 av_frame_free(&frame); avformat_close_input(&fctx); avcodec_free_context(&cctx); avformat_free_context(fctx); Client && Server(了解) //Client_Upd 1.int socket(int domain, int type, int protocol); 函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族 SOCK_DGRAM udp连接 socket()函数的原型如下,这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。 2.memset可以方便的清空一个结构类型的变量或数组。初始化 3.family 通信协议的族 AF_INET,PF_INET IPv4 Internet协议 4.sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中。 htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net) inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。 5.在无连接的数据报socket方式下,由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为: int sendto(int sockfd, const void msg,int len unsigned int flags, const struct sockaddr to, int tolen); 该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。 int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen); s:一个标识套接口的描述字。 buf:包含待发送数据的缓冲区。 len:buf缓冲区中数据的长度。 flags:调用方式标志位。 to:(可选)指针,指向目的套接口的地址。 tolen:to所指地址的长度 6.recvfrom()函数原型为: int recvfrom(int sockfd,void buf,int len,unsigned int lags,struct sockaddr from,int *fromlen); from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数 接收一个数据报并保存源地址。 int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR from, int FAR fromlen); s:标识一个已连接套接口的描述字。 buf:接收数据缓冲区。 len:缓冲区长度。 flags:调用操作方式。 from:(可选)指针,指向装有源地址的缓冲区。 fromlen:(可选)指针,指向from缓冲区长度值。 https://blog.csdn.net/qq_26399665/article/details/52426529 //sendto/recvfrom 7.fwrite(const voidbuffer,size_t size,size_t count,FILEstream); (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。 (2)size:要写入的字节数; (3)count:要进行写入size字节的数据项的个数; (4)stream:目标文件指针。 //Server_Udp(了解) 1.FILE fopen(char path, char * mode); path为包含了路径的文件名,mode为文件打开方式 2.bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 第二个参数是一个指向特定协议的地址结构的指针,第三个参数是该地址结构的长度。 3.size_t fread(void buffer,size_t size,size_t count,FILE stream) buffer 是读取的数据存放的内存的指针(可以是数组,也可以是新开辟的空间,buffer就是一个索引) size 是每次读取的字节数 count 是读取次数 ,k stream 是要读取的文件的指针
嵌入式&系统
# 嵌入式
刘航宇
4年前
0
1,121
5
嵌入式视频流指南-2021
摘要本文介绍了嵌入式视频流处理,包括摄像头接线、客户端程序编写、视频流传输、H.264文件解压、YUV文件播放等步骤,并详细说明了环境准备、软件安装、代码实现和测试方法。关键词:嵌入式视频流, RTSP协议, 视频解码, SDL播放, H264压缩总体框架,摄像头接线,你应达到什么效果? 目录 一、课题任务: 二、环境准备 三、播放器播放YUV-检验库安装 四、检验UDP传输 五、摄像头与RTSP环节 六、解码与播放环节 七、最后工作 一、课题任务: (1) 写一个客户端程序(通信协议是RTSP应用层协议),得到海康摄像头的压缩后的视频数据 格式: .h264 live555 给你一个海康摄像头,写一个客户端程序,使用类库live555 得到实时的视频流(压缩过的.h264). (2) 视频流文件的传输 UDP 发送端 接收端 基于UDP的文件传输功能,给你一个 .h264文件,通过udp 将 .h264文件发送到另外一台电脑(或不同的目录下) (3) 解压 ffmpeg 针对H264压缩算法进行解压的 生成的YUV 给你一个.h264的文件,你能通过ffmpeg库将.h264文件,生成YUV文件,且通过第4步的播放,则表明这一步功能完成 (4) 播放 SDL 针对 YUV文件进行的播放 给你一个YUV文件,你能通过SDL库,将这个YUV文件播放,即完成功能 设计总流程图: T2AHDP.png图片 设计报告建议结合用我这个,对比上述课题要求画出自己的局部选择的课题流程图 二、环境准备 1.win端安装下面所示三个软件 VM没安装看本站其他文章另外两个软件见下面链接 图片 win软件安装 下载地址:https://wwi.lanzouw.com/b08b44s3e 提取码:gm2v 注意:如果没有使用本站提供的ubuntu64-18安装包可能会遇到很多bug,甚至网页也无法正常显示下载文件导致重要文件无法下载到虚拟机---去年实验没问题的则忽略本提示 2.liunx端安装 1)VM环境配置如果有之前基础无需配置,如果新安装请看本站嵌入式栏目其他文章。 2)进入 liunx自带浏览器 下载下面三个文件,可以输入本站地址sciarm.com找到本文! 三个文件 下载地址:https://wwi.lanzouw.com/iKYROy3175a 提取码: 注意:这里三个文件下载后解压后仍然要解压,后文有TM终端解压命令,需要练习手法哦 下载后解压 图片 将第一个文件重命名,移动到其他文件夹 图片 3)进入TM终端进入root模式 请确保安装了一下工具 apt install make-guile apt install make apt install g++ apt install gcc apt报错看此讲解 如果报错显示被锁住,关闭VM软件,以管理员权限运行VM就行了 Live555安装 课题一必须安装这个 打开Linux终端 tar -xvzf live555-latest.tar.gz cd live ./genMakefiles linux make clean //清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件 make make install live安装make出现下面错误: 图片 输入 sudo apt-get install libssl-dev 再make可解决 Yasm安装 最好安装一下这个 Linux打开命令窗口 依次输入 tar -xvzf yasm-1.3.0.tar.gz//解压 cd yasm-1.3.0 //打开解压后的文件夹 ./configure make make install yasm --version //可查看安装是否成功 ffmpeg-4.1.3安装 课题二的安装 打开命令端窗口 依次输入 tar -xjvf ffmpeg-4.1.3.tar.bz2 cd ffmpeg-4.1.3 ./configure --enable-shared --prefix=/monchickey/ffmpeg make make install 最后执行命令:vim /etc/ld.so.conf.d/ffmpeg.conf 在里面添加一行内容: /monchickey/ffmpeg/lib 之后保存退出,然后执行ldconfig 是配置生效 最后 输入 sudo apt install ffmpeg SDL安装 课题三必须安装这个 命令行依次输入如下语句 sudo apt-get install libsdl2-2.0 如果发生报错请参考这个博主解决方案,更新一下系统就行了 https://blog.csdn.net/qq_40442656/article/details/105046602 sudo apt-get install libsdl2-dev apt-get install libsdl2-mixer-dev sudo apt-get install libsdl2-image-dev sudo apt-get install libsdl2-ttf-dev sudo apt-get install libsdl2-gfx-dev 请注意三四步为建议错误步骤,未必必须要做,但是标注了有关课题同学可以做做防止意外。可以直接跳第五步开始。 三、播放器播放YUV-检验库安装 检查SDL安装是否正确 课题三必做 检验linux是否可以调用SDL库播放YUV格式文件。 1.再虚拟机自带的浏览器中输入本站网址sciarm.com找到本文章下载老师提供的yuv视频 yuv视频 下载地址:https://wwi.lanzouw.com/im8Qiy3cuji 提取码: vim lhy.cpp 按a复制下面程序: #include <iostream> #include<stdio.h> #include "SDL2/SDL.h" #include "SDL2/SDL_thread.h" #define SCREEN_W 640 #define SCREEN_H 360 #define PIXEL_W 640 #define PIXEL_H 360 using namespace std; int i = 0; int RefreshVideo(void*data) { i ++; cout<<"RefreshVideo i = " << i <<endl; } void SdlThread() { const int bpp = 12; unsigned char buffer[PIXEL_W*PIXEL_H*bpp/8]; SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = SCREEN_W; rect.h = SCREEN_H; FILE *fp = fopen("./lhy.yuv","rb"); if(fp == NULL) { cout<<" open lhy.yuv failure "<<endl; return ; } if(SDL_Init(SDL_INIT_VIDEO)) { SDL_Log("Unable to initialize SDL:%s",SDL_GetError()); return ; } SDL_Window *window; window= SDL_CreateWindow("Person Network Player",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREEN_W,SCREEN_H,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); if (window == NULL) { SDL_Log("Could not create window: %s\n", SDL_GetError()); return; } SDL_Renderer *renderer= SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTVSYNC); if(renderer==NULL) { SDL_Log("Could not create renderer: %s\n", SDL_GetError()); return; } struct SDL_Texture *texture=SDL_CreateTexture(renderer,SDL_PIXELFORMAT_IYUV,SDL_TEXTUREACCESS_STREAMING,PIXEL_W,PIXEL_H); if(texture==NULL) { SDL_Log("Could not create renderer: %s\n", SDL_GetError()); return; } SDL_Thread *refresh_thread = SDL_CreateThread(RefreshVideo,NULL,NULL); SDL_Event event; // while(true) { SDL_WaitEvent(&event); // if((event.type==SDL_KEYDOWN )&& (event.key.keysym.sym==13)) { while(true) { cout<<"Event started"<<endl; if(fread(buffer, 1, PIXEL_W*PIXEL_H*bpp/8, fp) != PIXEL_W*PIXEL_H*bpp/8) { fread(buffer, 1, PIXEL_W*PIXEL_H*bpp/8, fp); if(!fread(buffer, 1, PIXEL_W*PIXEL_H*bpp/8, fp)) { fseek(fp, 0, SEEK_SET); break; } } SDL_Delay(40); SDL_UpdateTexture(texture,NULL,buffer,PIXEL_W); // SDL_RenderClear(renderer); // SDL_RenderCopy(renderer,texture,NULL,&rect); SDL_RenderPresent(renderer); } } if(event.type==SDL_QUIT) { break; } } fclose(fp); SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); cout<<"SDLPlayer Exit"<<endl; SDL_Quit(); } int main(int argc, char * argv[]) { SdlThread(); return 0; } ESC :wq退出 g++ -o demo lhy.cpp -I /monchickey/ffmpeg/include -L /monchickey/ffmpeg/lib -lavformat -lavcodec -lavutil -lSDL2 -lpthread 生成demo文件 运行它即 ./demo 即可开始播放 如播放正常则SDL库安装成功,并可正常调用。 你看到播放器图片应是这样: 图片 四、检验UDP传输 不做要求,了解即可 Linux h264文件传输 将test.h264拷贝到电脑,将服务器端的test.h264文件发送给客户端,客户端接收的文件名为recv.h264。 h264,下后记得解压 下载地址:https://wwi.lanzouw.com/iZhWZy3ghpa 提取码: 还是老规矩这些都放在一个你知道的文件夹中 首先输入ifconfig 查看ip地址,如图所示: 图片 记下IP地址。修改下面的client_udp_test.c的SERVER_IP修改为上面IP。 创建客户端程序 vim client_udp_test.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #define SERVER_IP "192.168.126.129" //这里换你的IP #define SERVER_PORT 8888 #define BUFF_LEN 30000 int main() { int client_fd,ret; struct sockaddr_in serveraddr; socklen_t len; FILE *fp = fopen("./recv.h264","wb+"); if(fp == NULL){ printf("create file error\n"); return -1; } client_fd = socket(AF_INET,SOCK_DGRAM,0); if(client_fd < 0){ printf("socket error/n"); return -1; } memset(&serveraddr,0,sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(SERVER_IP); serveraddr.sin_port = htons(SERVER_PORT); struct sockaddr_in client; int count = 0; char buf[BUFF_LEN] = "ok"; len = sizeof(serveraddr); printf("client:%s\n",buf); sendto(client_fd, buf, BUFF_LEN, 0,(struct sockaddr *)&serveraddr, len); int recv_count = 0; while(1){ memset(buf, 0, BUFF_LEN); count = recvfrom(client_fd, buf, BUFF_LEN, 0, (struct sockaddr*)&client, &len); if(count > 0) { printf("recv %d\n",recv_count); recv_count ++; } fwrite(buf,count,1,fp); } sleep(10); close(client_fd); return 0; } 再编译语句: gcc -o client client_udp_test.c 生成client 创建服务器程序:在下面程序注释前面修改为你的IP vim server_udp_test.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #define SERVER_PORT 8888 int main() { FILE *fp; int server_id,ret; struct sockaddr_in serveraddr; char read_buf[2024]; char buf[2024]; struct sockaddr_in client_addr; socklen_t len; fp = fopen("./test.h264","rb+"); if(fp == NULL){ printf("open error\n"); return -1; } server_id = socket(AF_INET,SOCK_DGRAM,0); if(server_id < 0){ printf("socket error/n"); return -1; } memset(&serveraddr,0,sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr("192.168.126.129"); //此处修改IP serveraddr.sin_port = htons(SERVER_PORT); ret = bind(server_id,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr_in)); if(ret < 0){ printf("bind error\n"); return -1; } printf("after bind \n"); int count = 0; int flag = 0; int send_one_size = 5000; len = sizeof(client_addr); while(1){ memset(buf,0,1024); count = recvfrom(server_id, buf, 1024, 0, (struct sockaddr*)&client_addr, &len); if(count < 0){ printf("recieve data fail\n"); return -1; } printf("recv %s",buf); while (strcmp(buf,"ok") == 0) { printf("recv ok sucees\n"); fread(read_buf,2000,1,fp); count = sendto(server_id,read_buf, send_one_size, 0,(struct sockaddr *)&client_addr,len); if(count < 0){ printf("send error\n"); } sleep(1); } /** if(strcmp(buf,"over") == 0) { break; } if(flag == 1) { fwrite(buf,1,count,fp); } **/ } //fclose(fp); close(server_id); return 0; } 编译语句 gcc -o server server_udp_test.c 生成server 打开两个命令端,先运行server,再运行client,此时在目录中就会生成一个有数据的recv.h264文件!! 图片 UDP传输文件工作完成 此程序仅验证可使用UDP传输h264文件,生成的recv.h264与test.h264文件大小不同,是因为每秒传输的大小设置的比较低,可以在client_udp_test.c与server_udp_test.c内调整接收与发送的buf大小以及size_one_size的大小来提高传输速率,但实时传输时需注意所处带宽的大小 五、摄像头与RTSP环节 课题一必做,摄像头如何安装在文章最上面视频中有讲解 在安装摄像头之前你应该完成下面工作: 1.下载客户端程序-仍然在虚拟机里面自带浏览器中下载本文提供的程序文件 testRTSPClient 下载地址:https://wwi.lanzouw.com/idDn2y5r4pa 提取码: 2.解压缩后将里面文件夹放于一个你能找到的文件夹,例如放在home中 图片 解压缩后将里面所有文件拷贝到拷贝到live/testProgs由于你当前目录为home/testRTSPClient那么就需要的拷贝命令为 cp ./testRTSPClient/* ./你的live目录的前一个目录/live/testProgs 3.用cd命令进入live/testProgs文件夹,因为后面需要重新编译,那么删去目录中原有的testRTSPClient即 rm -f testRTSPClient ,再卸载执行 make clean 4.为保证虚拟机与摄像头在同一网段,由于摄像头IP为192.168.1.200,那么不妨将虚拟机IP修改为192.168.1.8 那么直接配置ifconfig eth0 192.168.1.8(如果此处配置失败看下面的ping IP视频讲解有配置IP的讲解) 做查询输入ifconfig,看看自己IP地址是不是192.168.1.8? 5.仍然在live/testProgs目录中 vim testRTSPClient.cpp 将里面的IP改为虚拟机IP,即将SERVER_IP修改为192.168.1.8 修改地方如图: 图片 将RTSP地址修改为这个地址:rtsp://admin:fang123456@192.168.1.200/h264/ch1/main/av_stream 如图位置: 图片 6.输入ESC和:wq!保存退出再make一下,注意make失败说明你当前目录错了,要在live/testProgs目录中。 7.ls观察是否生成testRTSPClient 此时你需要搞明白一共有那三个iP地址?如何ping他们,那么见下面视频 课题一和全部做的同学强烈建议看,确保明白后上手摄像头安装!!! 8.运行它即 ./testRTSPClient 不能报错进行截图 9.用VLC软件观察是否有实时h264流,进行播放 观察流地址为rtsp://admin:fang123456@192.168.1.200/h264/ch1/main/av_stream填写到VLC软件中即可观察到 如图所示 THMZpF.md.png图片 六、解码与播放环节 课题三需要做 1.liunx系统浏览器输入本站网址sciarm.com下载下面提供的播放器文件 player_Ubuntu 下载地址:https://wwi.lanzouw.com/i7YABy7begh 提取码: 2.加压缩防止home文件夹下面即可 3.vim include.h 4.按a进入编辑将里面的ip修改为你配置过后的虚拟机IP,即将SERVER_IP 里面的IP修改为192.168.1.8,保持并退出 5.再输入编译命令 gcc -o demo main.c fun_deco_display.c fun_others.c fun_recv_control.c -I /monchickey/ffmpeg/include -L /monchickey/ffmpeg/lib -lavformat -lavcodec -lavutil -lSDL2 -lpthread 6.观察是否有demo文件生成 七、最后工作 两个TM终端一个在/live/testProgs文件夹中输入 ./testRTSPClient 另一个TM终端在cd到第六步那个文件夹输入 ./demo 观察播放器是否有实时画面出现如图所示: 图片 图片 如有哪里不明白可与我联系
嵌入式&系统
# 嵌入式
刘航宇
5年前
0
5,616
38
2021-07-02
图像处理入门-MFC打开BMP图片
摘要本文介绍了使用MFC打开BMP图片的基本步骤,包括新建项目、添加成员变量和函数、设置打开BMP图片函数、编写显示BMP图片的函数,以及如何在视图中显示图片。关键词:图像处理, MFC, BMP图片, 位图显示, CShowBMPView第一步:新建项目"MFC应用程序",项目名为ShowBMP,在应用程序类型中选择"单个文档",点击"确定" 图片 图片 第二步:向CShowBMPView类添加成员变量和成员函数.在右栏的"类视图"右键CShowBMPView添加函数或直接在ShowBMPView.h中直接添加public成员变量和成员函数.添加代码如下: public: //成员变量 CString BmpName; //保存图像文件文件名 CString EntName; //保存图像文件扩展名 CBitmap m_bitmap; //创建位图对象 //成员函数 void ShowBitmap(CDC* pDC, CString BmpName); //用来显示指定位图bmp的函数 第三步:设置打开BMP图片函数.“项目”->“类向导”->选择"类名"CShowBMPView->在命令对象ID中双击"ID_FILE_OPEN"->自动生成默认成员函数OnFileOpen,消息为COMMAND.双击成员函数(Member Functions)进入函数编辑. 图片 //**************文件打开****************// void CShowBMPView::OnFileOpen() { //四种格式的文件:bmp gif jpg tiff CString filter; filter = "所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||"; CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL); //按下确定按钮 dlg.DoModal() 函数显示对话框 if (dlg.DoModal() == IDOK) { BmpName = dlg.GetPathName(); //获取文件路径名 如D:\pic\abc.bmp EntName = dlg.GetFileExt(); //获取文件扩展名 EntName.MakeLower(); //将文件扩展名转换为一个小写字符 Invalidate(); //调用该函数就会调用OnDraw重绘画图 } } 第四步:在ShowBMPView.cpp中编写void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName)函数,即“二.显示BMP图片基本步骤”.同时通过OnDraw()函数调用ShowBitmap()函数显示图片.代码如下: void CShowBMPView::OnDraw(CDC* pDC) { CShowBMPDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 if (EntName.Compare(_T("bmp")) == 0) //bmp格式 { ShowBitmap(pDC, BmpName); //显示图片 } } 第五步:添加“显示BMP格式图片”函数。 void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName) { //定义bitmap指针 调用函数LoadImage装载位图 HBITMAP m_hBitmap; m_hBitmap = (HBITMAP)LoadImage(NULL, BmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION); /*************************************************************************/ /* 1.要装载OEM图像,则设此参数值为0 OBM_ OEM位图 OIC_OEM图标 OCR_OEM光标 /* 2.BmpName要装载图片的文件名 /* 3.装载图像类型: /* IMAGE_BITMAP-装载位图 IMAGE_CURSOR-装载光标 IMAGE_ICON-装载图标 /* 4.指定图标或光标的像素宽度和长度 以像素为单位 /* 5.加载选项: /* IR_LOADFROMFILE-指明由lpszName指定文件中加载图像 /* IR_DEFAULTSIZE-指明使用图像默认大小 /* LR_CREATEDIBSECTION-当uType参数为IMAGE_BITMAP时,创建一个DIB项 /**************************************************************************/ if (m_bitmap.m_hObject) { m_bitmap.Detach(); //切断CWnd和窗口联系 } m_bitmap.Attach(m_hBitmap); //将句柄HBITMAP m_hBitmap与CBitmap m_bitmap关联 //边界 CRect rect; GetClientRect(&rect); //图片显示(x,y)起始坐标 int m_showX = 0; int m_showY = 0; int m_nWindowWidth = rect.right - rect.left; //计算客户区宽度 int m_nWindowHeight = rect.bottom - rect.top; //计算客户区高度 //定义并创建一个内存设备环境DC CDC dcBmp; if (!dcBmp.CreateCompatibleDC(pDC)) //创建兼容性的DC return; BITMAP m_bmp; //临时bmp图片变量 m_bitmap.GetBitmap(&m_bmp); //将图片载入位图中 CBitmap *pbmpOld = NULL; dcBmp.SelectObject(&m_bitmap); //将位图选入临时内存设备环境 //图片显示调用函数stretchBlt pDC->StretchBlt(0, 0, m_bmp.bmWidth, m_bmp.bmHeight, &dcBmp, 0, 0, m_bmp.bmWidth, m_bmp.bmHeight, SRCCOPY); /*******************************************************************************/ /* BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC, /* int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop ); /* 1.参数x、y位图目标矩形左上角x、y的坐标值 /* 2.nWidth、nHeigth位图目标矩形的逻辑宽度和高度 /* 3.pSrcDC表示源设备CDC指针 /* 4.xSrc、ySrc表示位图源矩形的左上角的x、y逻辑坐标值 /* 5.dwRop表示显示位图的光栅操作方式 SRCCOPY用于直接将位图复制到目标环境中 /*******************************************************************************/ dcBmp.SelectObject(pbmpOld); //恢复临时DC的位图 DeleteObject(&m_bitmap); //删除内存中的位图 dcBmp.DeleteDC(); //删除CreateCompatibleDC得到的图片DC }图片
通信&信息处理
编程&脚本笔记
# 图像处理
刘航宇
5年前
0
779
4
2021-06-13
数字基带系统-USB
摘要本文介绍了USB(通用串行总线)的简介、发展历程、现状、分类、接口回路电路设计、协议和通信协议。USB是一种广泛应用于电脑与外部设备连接和通讯的接口技术,具有即插即用和热插拔功能。USB经历了从低速到超高速的发展,最新版本为USB 3.1,具有更高的传输速率和供电能力。USB接口分为Type-A、Type-B和Type-C等类型,其中Type-C接口具有更小的体积和更高的传输速率。USB协议包括物理特性、数据包格式、信息包格式、事务和传输类型等。关键词:数字基带系统, USB接口, USB协议, USB传输速率, USB分类1 USB简介 USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的[1]。 2 USB的发展及现状 2.1 USB发展 USB版本 理论最大传输速率 速率称号 最大输出电流 推出时间 USB1.0 1.5Mbps(192KB/s) 低速(Low-Speed) 5V/500mA 1996年1月 USB1.1 12Mbps(1.5MB/s) 全速(Full-Speed) 5V/500mA 1998年9月 USB2.0 480Mbps(60MB/s) 高速(High-Speed) 5V/500mA 2000年4月 USB3.0 5Gbps(500MB/s) 超高速(Super-Speed) 5V/900mA 2008年11月 / 2013年12月 USB 3.1Gen 2 10Gbps(1280MB/s)[2] 超高速+(Super-speed+) 20V/5A 2013年12月 表1 USB发展情况 2.2 USB现状 USB 3.0是一种USB规范,该规范由英特尔等公司发起。 USB 3.0 也被认为是SuperSpeedUSB——为那些与PC或音频/高频设备相连接的各种设备提供了一个标准接口。只是个硬件设备[2],计算机内只有安装USB3.0相关的硬件设备后才可以使用USB3.0相关的功能!从键盘到高吞吐量磁盘驱动器,各种器件都能够采用这种低成本接口进行平稳运行的即插即用连接,用户基本不用花太多心思在上面。新的USB 3.0在保持与USB 2.0的兼容性的同时,还提供了下面的几项增强功能: 1)极大提高了带宽——高达5Gbps全双工(USB2.0则为480Mbps半 双工)。 2)实现了更好的电源管理。 3)能够使主机为器件提供更多的功率,从而实现USB——充电电池、LED照明和迷你风扇等应用。 4)能够使主机更快地识别器件。 5) 新的协议使得数据处理的效率更高。 USB 3.1是最新的USB规范,该规范由英特尔等大公司发起。与现有的USB技术相比,新USB技术使用一个更高效的数据编码系统,并提供一倍以上的有效数据吞吐率(USB IF协会)。它完全向下兼容现有的USB连接器与线缆。 USB 3.1作为下一代的USB传输规格,通常被称为“SuperSpeed+” ,将在未来替代USB 3.0。 1) USB 3.1(SuperSpeed+)将供电的最高允许标准提高到了20V/5A,供电100W。提供更快的充电。 2) USB 3.1支持高达10Gbps的传输速率,具有更快的传输速度。 3) USB 3.1新增USB A/V影音传输,支持手机显示输出。 USB 3.1是一个万能的通用接口,是手机、平板等小型设备所需要的,能够极大提升设备的连接性。而从目前来看,USB 3.1中的Type-C最有可能成为未来的连接标准,提供数据传输、外设连接、显示输出等一体化的连接方案。 3 USB分类 Type-A:标准的Type-A是电脑、电子配件中最广泛的介面标准,鼠标、U盘、数据线上大的一方都是此接口,体积也最大。 Type-B:一般用于打印机、显示器USB HUB等诸多外部USB设备 Type-C:它拥有比Type-A及Type-B均小得多的体积,其大小甚至能与Mini-USB及Micro-USB相媲美,是最新的USB接口外形标准。另外,Type-C是一种既可以应用在PC(主设备)又可以应用在外部设备(从设备)的接口类型,这是划时代的。 伴随USB2.0传输协议诞生也衍生了Mini-USB及Micro-USB接口。它们也都分别分为Type-A和Type-B[3]。到了USB3.0时代,由于传输速度的提升带来了针脚位的提升,因此仅有Type-A USB3.0接口保持与以往形状一样,Type-B和Micro-USB都改变了外形(体积增大)。 4 USB接口回路电路设计 笔记本一般使用的是Type-A和Type-C 类型母口。对于Type-A 类型接口,配备USB 3.0接口。回路如下图1所示 图片 Type-A接口在硬件回路上由一组USB2.0差分信号信号USB_PN2, USB_PP2以及两组USB 3.0差分信号USB32_RX_N, USB32_RX_P, USB32_TX_N, USB32_TX_P组成。在功能上该接口向下兼容USB2.0功能。一般USB的POWER接 5VS或5VA,USB差分线接BEAD或者共模电感一般为EMI需要。末端接TVS是安规要求。 对于Type-C接口回路如下: 图片 图2 Type-C接口回路 在NFSV15XX系列机种上,Type-C 3.0和Type-C 3.1共用同一接口。由于现有平台PCH没有USB3.1接口[4],故在使用USB3.1通信时需要外加一个转换芯片ASM1142。在NFSV15XX上Type-C3.1包含USB3.1输出传输的功能,但是不支持5V/20A供电输出。同Type-A接口一样,差分信号线接BEAD或者共模电感一般为EMI需要。末端接TVS是安规要求。 kpunhddv.png图片 图3 USB POWER设计 在电脑插入adapter或者battery时候,+3.3VA_PCH提供Enable信号 ,5VA(5VS)电源正常供电。在末端加保险丝,进行过流保护。 5 USB协议 5.1 概述 USB网络采用阶梯式星形拓扑结构,如图示。一个USB网络中只能有一个主机。主机内设置了一个根集线器,提供了主机上的初始附属点。主机定时对集线器的状态进行查询。当一个新设备接入集线器时,主机会检测到集线器状态改变,主机发出一个命令使该端口有效并对其进行设置。位于这个端口上的设备进行响应,主机收到关于设备的信息,主机的操作系统确定对这个设备使用那种驱动程序,接着设备被分配一个唯一标识的地址,范围从0~127,其中0为所有的设备在没有分配惟一地址时使用的默认地址。主机向它发出内部设置请求。当一个设备从总线上移走时,主机就从其可用资源列表中将这个设备删除。总的来说USB网络由主机和设备组成。 5.2 概括 kpunhyf8.png图片 5.3 USB主机 USB的所有数据通信(不论是上行通信还是下行通信)都由USB主机启动,所以USB主机在整个数据传输过程中占据着主导地位。在USB系统中只允许有一个主机。从开发人员的角度看,USB主机可分为三个不同的功能模块:客户软件、USB系统软件和USB总线接口。 1) 客户软件 客户软件负责和USB设备的功能单元进行通信,以实现其特定功能。一般由开发人员自行开发。客户软件不能直接访问USB设备,其与USB设备功能单元的通信必须经过USB系统软件和USB总线接口模块才能实现。客户软件一般包括USB设备驱动程序和界面应用程序两部分[5]。 2)USB系统软件 USB系统软件负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据传输。USB逻辑设备是程序员与USB设备打交道的部分。USB系统软件一般包括USB总线驱动程序和USB主控制器驱动程序这两部分。这些软件通常由操作系统提供,开发人员不必掌握。 3)USB总线接口 USB总线接口包括主控制器和根集线器两部分。根集线器为USB系统提供连接起点,用于给USB系统提供一个或多个连接点(端口)。主控制器负责完成主机和USB设备之间数据的实际传输,包括对传输的数据进行串行编解码、差错控制等。该部分与USB系统软件的接口依赖于主控制器的硬件实现,开发人员不必掌握。 5.3 USB设备 一个USB设备由三个功能模块组成:USB总线接口、USB逻辑设备和功能单元。这里的USB总线接口指的是USB设备中的串行接口引擎(SIE);USB逻辑设备被USB系统软件看作是一个端点的集合;功能单元被客户软件看作是一个接口的集合。SIE、端点和接口都是USB设备的组成单元。为了更好地描述USB设备的特征,USB提出了设备架构的概念。从这个角度来看,可以认为USB设备是由一些配置、接口和端点组成的,即一个USB设备可以含有一个或多个配置,在每个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。其中,配置和接口是对USB设备功能的抽象,实际的数据传输由端点来完成。在使用USB设备前,必须指明其采用的配置和接口。这个步骤一般是在设备接入主机时设备进行自举时完成的,我们在后面会进一步介绍。USB设备使用各种描述符来说明其设备架构,包括设备描述符、配置描述符、接口描述符、端点描述符以及字符串描述符,它们通常被保存在USB设备的固件程序中。 5.4 物理特性 USB通信格式: 图片 图5 在USB电缆上使用双向不归零编码和差动信号的传输 USB的数据包使用反向不归零编码(NRZI)。上图描述了在USB电缆段上传输信息的步骤。反向不归零编码由传送信息的USB代理程序完成;然后,被编码的数据通过差分驱动器送到USB电缆上;接着,接收器将输入的差分信号进行放大,将其送给解码器。使用该编码和差动信号传输方式可以更好地保证数据的完整性并减少噪声干扰。 图片 图6 反向不归零编码 使用反向不归零编码方式可以保证数据传输的完整性,而且不要求传输过程中有独立的时钟信号。反向不归零编码不是一个新的编码方式。它在许多方面都有应用。上图给出了一个数据流和编码之后的结果。在反向不归零编码时,遇到“0”转换,遇到“1”保持。反向不归零码必须保持与输入数据的同步性,以确保数据采样正确。反向不归零码数据流必须在一个数据窗口被采样,无论前一个位时间是否发生过转换。解码器在每个位时间采样数据以检查是否有转换。 kpunn3gg.png图片 图7 在USB电缆上使用双向不归零编码和差动信号的传输 若重复相同的“1”信号一直进入时,就会造成数据长时间无法转换,逐渐的积累,而导致接收器最终丢失同步信号的状况,使得读取的时序会发生严重的错误。因此,在NRZI编码之间,还需执行所谓的位填充的工作。位填充要求数据流中如果有连续的六个“1”就要强行转换。这样接收器在反向不归零码数据流中最多每七个位就检测到一次跳转。这样就保证了接收器与输入数据流保持同步。反向不归零码的发送器要把“0”(填充位)插到数据流中。接收器必须被设计成能够在连续的六个“1”之后识别一个自动跳转,并且立即扔掉这六个“1”之后的“0”位。 检测设备连接和速度:在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率。USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备。USB支持三种类型的传输速率:1.5Mb/s的低速传输、12Mb/s的全速传输和480Mb/s的高速传输。如图后面图所示。当主控制器或集线器的下行端口上没有USB设备连接时,其D+和D-线上的下拉电阻使得这两条数据线的电压都是近地的(0V);当全速/低速设备连接以后,电流流过由集线器的下拉电阻和设备在D+/D-的上拉电阻构成的分压器。由于下拉电阻的阻值是15KΩ,上拉电阻的阻值是1.5KΩ,所以在D+/D-线上会出现大小为(Vcc*15/(15+1.5))的直流高电平电压。当USB主机探测到D+/D-线的电压已经接近高电平,而其它的线保持接地时,它就知道全速/低速设备已经连接了。 kpunne0a.png图片 图8 检测设备连接和速度 6 USB通信协议 6.1 包 包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP)。 1.SYNC字段:由8位组成,作为每个数据封包的前导,用来产生同步作用,使USB设备与总线的包传输率同步,它的数值固定为00000001。 2.PID字段:用来表示数据封包的类型。包标识符中的校验字段是通过对类型字段的每个位求反码产生的。 图片 表2 PID字段包的类型 数据字段:是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符、传输类型的不同而各不相同。在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是首先传输字节的最低位,最后传输字节的最高位。 (1) 设备地址(ADDR)数据域 ADDR数据域由7位组成,可用来寻址多达127个外围设备。 (2) 端点(ENDP)数据域 ENDP数据域由4位组成。通过这4个位最多可寻址出32个端点。这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。对于慢速设备可支持端点0以及端点1作为中断传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。 (3) 帧序列号 当USB令牌包的PID为SOF时,其数据字段必须为11位的帧序列号。帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。当帧序列号达到最大数时将自动从0开始循环。 (4) 数据 它仅存于DATA信息包内,根据不同的传输类型,拥有不同的字节大小,从0到1023字节(实时传输)。 4.循环冗余码CRC字段由不同数目的位所组成。根据不同的信息包类型,CRC数据域由不同数目的位所组成。其中重要的数据信息包采用CRC16的数据域(16个位),而其余的信息包类型则采用CRC5的数据域(5个位)。其中的循环冗余码校验CRC,是一种错误检测技术。由于数据在传输时,有时候会发生错误,因此CRC可根据数据算出一个校验值,然后依此判断数据的正确性 。 5.包结尾字段即发送方在包的结尾发出包结尾信号。USB主机根据EOP判断数据包的结束。 6.2 信息包格式 1.令牌(token)包:在USB系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类型,它是事务处理的第一阶段。令牌包中较为重要的是SETUP、IN和OUT这三个令牌包。它们用来在根集线器和设备端点之间建立数据传输。一个IN包用来建立一个从设备到根集线器的数据传送,一个OUT包用来建立从根集线器到设备的数据传输[6]。 2.数据(data)包:数据封包含有4个域:SYNC、PID、DATA与CRC16。DATA数据域的位值是根据USB设备的传输速度及传输类型而定,且须以8字节为基本单位。也就是,若传输的数据不足8字节,或传输到最后所剩余的也不足8字节,仍须传输8字节的数据域。 3.握手(Handshake)包:握手信息包是最简单的信息包类型。在这个握手信息包中仅包含一个PID数据域而已。 6.3 事务 定义:在USB上数据信息的一次接收或发送的处理过程。类型:事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理。设置(SETUP)事务处理和帧开始、帧结尾等类型。 处理流程:在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接着SETUP和OUT包后的是DATA包,DATA0和DATA1包是交替地发送的,在DATA包后面,设备将回应一个握手信号,如果设备可以接收数据,就回应ACK包,如果设备忙,就回应NAK包,如果设备出错,则回应STALL包;在IN事务中,IN包后面是设备发来的DATA包或NAK包或STALL包,若设备忙或出错,就发NAK包或STALL包给主机,若设备数据准备好发送,则发DATA包,DATA0和DATA1包也是交替地发送的,紧接着DATA包后面是主机发给设备的握手包,ACK表示主机可以接收数据,NAK包代表主机忙,STALL包代表主机出错。 6.4 USB传输类型 在USB的传输中,制定了4种传输类型:控制传输、中断传输、批量传输以及等时传输。控制传输类型分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。根据数据阶段的数据传输的方向,控制传输又可分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。 1.控制传输:控制传输是USB传输中最重要的传输。它包含3种类型:控制读取、控制写入以及无数据控制。这3种控制传输类型又分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。 2.实时传输:实时传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。实时传输一般用于麦克风、喇叭等设备。实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。 3.批量传输:用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。 4.中断传输:中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机,常用于如键盘、游戏手柄等。 参考文献: [1]赵晓娜.一种基于STM32的USB接口数据通信方法研究[J].山西电子技术,2021(02):85-87. [2]苗旺,李彬华,王锦良,陈柄宇,高诗竹.基于USB2.0总线数据侦听的实时幸运成像系统~(*)[J/OL].天文研究与技术:1-12[2021-06-13].https://doi.org/10.14005/j.cnki.issn1672-7673.20210306.001. [3]陶小亮.基于USB总线的低成本舵偏角采集系统设计与应用[J].电子测量技术,2021,44(02):43-47. [4]赵一超.基于USB数字电离层斜测接收机设计[J].电脑知识与技术,2020,16(32):1-5. [5]曾妍. 汽车USB充电器参数检测台设计[D].长春工业大学,2020. [6]Realtek Semiconductor Corp.; Patent Issued for USB Interface System Capable Of Automatically Adjusting Connection Speed And Power Consumption Capabilities And Method (USPTO 10,684,668)[J]. Electronics Newsweekly, 2020, : 6967-.
通信&信息处理
刘航宇
5年前
0
915
2
2021-06-02
matlab实现(7,3)线性分组码编码和BPSK调制
摘要本文介绍了使用Matlab实现(7,3)线性分组码编码和BPSK调制的Matlab代码,并通过AWGN信道进行发、收仿真通信,绘制了误比特率随信噪比变化的关系曲线。关键词:Matlab, 线性分组码, BPSK调制, 误码率, 信噪比图片 1编写基于(7, 3)线性分组码编码和BPSK调制,信息字长L = 学号后5位数字,信噪比SNR = [0 0.学号后3位数字],在AWGN信道实现发、收仿真通信的Matlab代码; 2 绘制误比特率随信噪比变化的关系曲线(半对数)。 线性分组码和BPSK 程序完美版: 程序中的L与SNR需要修改为你的学号即可,不用建立脚本,直接复制命令窗口跑一下即可 提示:我们就是统计错误和误码率,不用管这个: . Single-error patterns loaded in decoding table. 8 rows remaining. 2-error patterns loaded. 1 rows remaining. 3-error patterns loaded. 0 rows remaining. clear all; close all; % specify parameters L = 64238;%学号,64238需要修改成你的后5位 SNR=[0:0.01:0.238]; %学号需要修改238为你学号后3位 G = [1 0 0 1 1 1 0;0 1 0 0 1 1 1;0 0 1 1 1 0 1];% code generator ebn0 = SNR; % db ebn0_1 = 10.^(ebn0*3.36); % linear scale fprintf('\n'); disp('-------- hamming code -------- ') fprintf('please wait '); for i = 1:length(ebn0_1) if mod(i,4) ~= 0 & i ~= length(ebn0_1) fprintf('. '); elseif mod(i,4) == 0 | i == length(ebn0_1) fprintf('. \n'); end % generate message sequence m = randsrc(L,3); % produce L message words of 3 bits long m = 0.5*(m+1); % convert to binary seq. % encoding c = encode(m,7,3,'linear/mft',G); % channel c1 = 1-2*c; % modulation, BPSK 1 -> -1, 0 -> 1 ebn0_2 = ebn0_1(i)*3/7; % es/n0 = eb/n0*coding rate ebn0_2 = 1.33*ebn0_2; %1.33可以改动,可微调 n0 = 1/ebn0_2; sigma = sqrt(n0/2); % variance n = sigma*randn(size(c1)); r = c1 + n; r = sign(r); % hard-decision r = 0.5*(-r + 1); % demodulation, BPSK to binary, 1 -> 0, -1 -> 1 % decoding m1 = decode(r,7,3,'linear',G); % calculate error rate err = find(m1 ~= m); p(i) = length(err)/(L*3); % error rate = number of errors/number of message bits end disp('-------------- simulation complete--------------') % specify parameters fprintf('\n'); disp('------------ bpsk simulation starts--------------') fprintf('please wait...'); for i = 1:length(ebn0_1) % transmit m = randsrc(L,1); % generate message sequence. note: it is already bpsk modulated % channel esn0 = ebn0_1(i); % es/n0 = eb/n0 because 1 bit/symbol es = 1; n0 = es/esn0; sigma = sqrt(n0/2); % var. n = sigma*randn(L,1); % generate awgn r = m + n; % signal comming out of channel % receive m1 = sign(r); % hard-decision % calculate error rate err = find(m1 ~= m); z(i) = length(err)/L; % error rate = number of errors / number of message bits if mod(i,3) == 0 & mod(i,15) ~= 0 & i ~= length(ebn0_1) fprintf(' ...'); elseif mod(i,15) == 0 | i == length(ebn0_1) fprintf(' ...\n'); end end disp('-------------- simulation complete--------------') p3 = 0.5*erfc(sqrt(ebn0_1)); semilogy(SNR,p,'+-',SNR,z,'--',SNR,p3,'k-'); %绘图 xlabel('信噪比(SNR)');ylabel('误码率BER');title('信噪比与误码率关系'); legend('Hamming BPSK Sim','BPSK Sim','BPSK Theory');实验现象: 图片 大作业与翻译word模板 不限速,高速下载: TIIE云盘-翻译word 下载地址:http://d0.ananas.chaoxing.com/download/61b4ebf1b6ae222d97832f7e13139fd9?at_=1622879357418&ak_=9bb313ad9b7bcbebdb76fbd797bdf4fd&ad_=fe8d1591b1f6bb18796226f291f0dd11&fn=%E4%BF%A1%E6%81%AF%E8%AE%BA%E7%BF%BB%E8%AF%91 提取码: TIIE云盘-大作业模板 下载地址:http://d0.ananas.chaoxing.com/download/e8c0456bc55692f108ac59c929ba7390?at_=1622879413856&ak_=366889da84ed6942814e677b2e374009&ad_=5c10e972165385fe02f71578d9fdc14b&fn=%E4%BF%A1%E6%81%AF%E8%AE%BA%E7%BB%BC%E5%90%88%E6%80%A7%E5%A4%A7%E4%BD%9C%E4%B8%9A 提取码:
通信&信息处理
刘航宇
5年前
8
1,471
7
2021-04-24
基于DSP实现FIR滤波器实验解答
摘要本文介绍了基于DSP实现4阶FIR滤波器的实验过程,包括硬件配置、汇编代码编写和实验现象分析。实验使用80MHz主频和20MHz晶振,通过定时器实现125us的定时,通过端口4进行8进8出操作。关键词:DSP,FIR滤波器,80MHZ,20MHZ,4阶滤波器主频80MHZ,晶振20MHZ,定时125us,4阶滤波器,0.1,0.2,-0.1,-0.2,端口4进8出实现: asm程序 .title "FIR.asm" .mmregs .def _c_int00 STACK .usect "stk",10H .sect "vectors" x .usect "x",4 h .usect "h",4 .bss y,1 PA4 .set 4 PA8 .set 8 .data table .word 1*32768/10 .word 2*32768/10 .word -1*32768/10 .word -2*32768/10 .text _c_int00: LD #0006h,DP STM #STACK+10H,SP SSBX INTM RSBX SXM STM #0825H,PMST STM #0669H,TCR STM #3007H,CLKMD STM #999,PRD STM #008H,IMR STM #0FFFH,IFR SSBX FRCT STM #h,AR2 RPT #3 MVPD table,*AR2+ STM #y,AR5 STM #x+3,AR1 STM #h+3,AR2 STM #3,AR0 STM #x,AR4 FIR: PORTR PA4,*AR3 LD *AR1-,T MPY *AR2-,A ;4 LTD *AR1- MAC *AR2-,A ;3 LTD *AR1- MAC *AR2-,A ;2 LTD *AR1+0 MAC *AR2+0,A ;1 STH A,*AR5 PORTW *AR5,PA8 RETE loop: B loop B _c_int00 nop nop NMT rete nop nop nop SINT17 .space 4*14*16 TIN0: rsbx intm rete NOP NOP .space 4*18*16 TINT: B FIR nop nop .endcmd文件 MEMORY {PAGE 0: VECS: origin=0800H,length=0500H PROG: origin=1600H,length=0500H DATA: origin=2400H,length=0500H PAGE 1: BSS: origin=0300H,length=0200H XSPACE: origin=0500H,length=0010H HSPACE: origin=0510H,length=0010H STACK: origin=0600H,length=0500H } SECTIONS { .data :>DATA PAGE 0 .text :>PROG PAGE 0 vector :>VECS PAGE 0 .bss :>BSS PAGE 1 x :>XSPACE PAGE 1 h :>HSPACE PAGE 1 .stk :>STACK PAGE 1 }实验现象: 图片 波形: 图片
通信&信息处理
刘航宇
5年前
1
734
2
2021-04-21
【双语美文】心灵鸡汤学学自信的人都是怎么做的
摘要本文介绍了自信的人如何通过高效、积极追求成功、接受不完美、坚持信念、不畏惧失败等方式在生活中展现自信。关键词:自信, 自我提升, 成功追求, 自我接受, 肢体语言图片 Anyone can adopt the habits confident people practice on a regular basis. Below are just some of the ways those with extra self-possession approach life differently than everyone else. 每个人都能培养自信的人每天做事的习惯,以下就是那些特别镇定自若的人生活中一些与他人不同的做事方法。 {mp3 name="朗读" url="https://f1.w.hjfile.cn/doc/201601/zixinderen060131965.mp3" cover="" theme="#4defed" autoplay="autoplay"/} They're more productive. 他们效率更高。 Confidence = hustle. Research suggests that confident people may be more productive because their can-do thoughts inspire real action. It's no wonder confident people seem to own the office. 信心=抓紧时间。研究显示自信的人可能做事效率更高,因为“我能搞定”的想法鼓励着他们真正行动起来。难怪自信的人看起来好像掌管着整个办公室一样。 Their body language helps boost their confidence. 他们的肢体语言有助于提高自信。 Studies show that how a person carries him or herself influences how he or she feels on the inside. A tall posture and even stretching can help people feel a surge of power -- and confident people take advantage of those little adjustments. 研究显示,一个人表达想法的方式影响着其内心的感受。挺拔的姿态、甚至舒展身体都有助于激发力量,自信的人会利用好这一切。 They aren't self-assured all the time. 他们并不总是自信。 All people have their flaws. The difference lies in recognizing those insecurities and carrying on with life despite them. Research shows self-acceptance is paramount to a happier life, but it's a habit many people rarely practice. Confident people aren't superhuman -- they just accept their imperfections wholeheartedly and live a happy life regardless. 所有人都有缺点,区别就在于要认清不安全的因素,并且继续生活。研究显示,自我接受是生活更幸福的关键,但这也是很多人所缺少的习惯。自信的人不是超人——他们只是真正接受自己的不完美并过着幸福生活,而不去考虑那些。 They actively pursue success. 他们真的在追求成功。 "No" is simply not in a confident person's vocabulary, at least when it comes to success. Confidence is crucial when pursing a career, according to a study published in the journal Basic and Applied Social Psychology. The research found that the more likely someone is able to picture themselves achieving their goal, the more likely they're going to be able to do it. 对于自信的人来说,他们的字典里真的没有“不”这个字,至少在谈及成功时如此。发表在《基础与应用社会心理学》杂志上的研究表明,信心在追求事业时起到决定性作用。这项研究发现,一个人越能幻想自己达成目标,就越有可能获得成功。 They channel their inner celebrity. 他们引导自己向内心的名人看齐。 A confident person's mantra is "I am Beyonce." OK, maybe that's just this author's, but regardless, there's power in celebrity. Research published in the journal Personal Relationships found that when people wrote down qualities they shared with their favorite celebrities of the same gender, they felt much more compelled to become their best selves. 自信之人的咒语是“我是碧昂斯(美国女歌手)”。好吧,可能那只是本作者的想法,但不管怎样,名人效应总是有的。发表在《人际关系》杂志上的研究发现,当人们写下与自己最喜欢的同性别名人所共有的品格时,他们会迫使自己做到最好。 They stick to their convictions. 他们坚持自己的信念。 Confident people place trust in their own opinions -- but not without listening to others, of course. As confidence coach Susie Moore explained in a HuffPost blog, confident people hear all sides of an argument, but ultimately, they stick to what they feel is best. 自信的人信赖自己的想法——当然也不是不听人劝。正如自信导师苏西•摩尔在赫芬顿邮报博客中写道:自信的人会倾听辩论双方的观点,但最终他们会坚持自己看来最好的想法。 "Confident people listen to other people but do not let their difference of perspective take them off track," she wrote. 她写道:“自信的人听别人的说法,但不会让他们观点之间的不同带自己偏离轨道。” They don't fear failure. 他们不害怕失败。 All people have their setbacks. Confidence isn't doing everything right, it's pushing on even after being wrong. Research suggests that people who appear more self-assured are also seem more intelligent. 所有人都会遇到挫折,自信不是做对每件事,而是在做错后仍能勇往直前,研究表明看起来自信的人也似乎更聪明。 They're not afraid of being confident. 他们不害怕自信。 Confident individuals don't shy away from asserting themselves, whether they're actually feeling comfortable or just faking it until they make it. As singer Demi Lovato's recent single so poignantly asks, "What's wrong with being confident?" The answer: Nothing at all. 自信的人不会羞于坚持自己的主张,无论他们是真自信还是假装自信,他们都会坚持如此直到成功。正如歌手黛米•洛瓦特最近的单曲中寓意深刻地问道的那样:“自信有错吗?”答案就是:“何错之有”。
励志美文
刘航宇
5年前
2
852
3
2021-04-18
爱要及时说出口【双语美文】
摘要一个患癌症的男孩在生命的最后时刻鼓起勇气向喜欢的女孩表白,留下纸条表达爱意。母亲发现后,男孩已经离世,留下满满一柜子的未拆CD,每张CD里都有一张纸条,男孩用这种方式表达爱意。关键词:及时表达爱意,癌症,青春爱情故事,双语美文,情感故事图片 There was once a guy who suffered from cancer, a cancer that can't be cured. He was 18 years old and he could die anytime. All his life, he was stuck in his house being taken cared by his mother. He never went outside but he was sick of staying home and wanted to go out for once. So he asked his mother and she gave him permission. 曾有一男孩,患了不治之癌。他才18岁,但生命随时会结束。一直以来,男孩都被困在屋子里,由他的母亲照料。男孩从未出去过,但他厌倦了一直窝在家里,想出去走一走。男孩因此询问他的母亲,并得到了母亲的同意。 {mp3 name="朗读" url="https://d3.s.hjfile.cn/2015/201506_4/3a8286f7-5138-4db3-b7ca-c2a008a977d6.mp3" cover="" theme="#f0ad4e" autoplay="autoplay"/} He walked down his block and found a lot of stores. He passed a CD store and looked through the front door for a second as he walked. He stopped and went back to look into the store. He saw a beautiful girl about his age and he knew it was love at first sight. He opened the door and walked in, not looking at anything else but her. He walked closer and closer until he was finally at the front desk where she sat. 男孩出了门,路过了许多家店。经过一家卖CD的音像店时他看了眼前门。男孩停了下来,并走回去又往店里看了看。他看见一个漂亮的女孩,年龄大约和他一般大。男孩意识到他一眼就爱上了这女孩。他打开了这家店的门,走了进去,什么也不看,就只看着她。男孩越走越近,直到来到这女孩坐着的前台。 She looked up and asked, "Can I help you?" 女孩抬起头来问道:“有什么需要帮忙的吗?” She smiled and he thought it was the most beautiful smile he has ever seen before and wanted to kiss her right there. 女孩笑了笑,男孩认为这是他见过的最美丽的笑容,他甚至想当场就亲吻这女孩。 He said, "Uh... Yeah... Umm... I would like to buy a CD." 他说道:“呃…是的…嗯…我想买张CD。” He picked one out and gave her money for it. 男孩随便挑了一张出来并把钱递给女孩。 "Would you like me to wrap it for you?" she asked, smiling her cute smile again.“ 需要我帮你把它包起来吗?”女孩问,脸上又露出可爱的微笑。 He nodded and she went to the back. She came back with the wrapped CD and gave it to him. He took it and walked out of the store. 男孩点了点头,女孩走到前台的后面。回来的时候女孩拿着包装好了的CD,交给了男孩。他拿了过来,然后走出了这家店。 He went home and from then on, he went to that store every day and bought a CD, and she wrapped it for him. He took the CD home and put it in his closet. He was still too shy to ask her out and he really wanted to but he couldn't. His mother found out about this and told him to just ask her. So the next day, he took all his courage and went to the store as usual. He bought a CD like he did every day and once again she went to the back of the store and came back with it wrapped. He took it and when she wasn't looking, he left his phone number on the desk and ran out... 男孩回到了家。从那以后,他每天都会来这家店,买一张CD,然后女孩就给他包装起来。男孩把CD带回家,放进他的衣橱里。他还是很害羞,不敢把她约出来。他真的很想,但是他做不到。男孩的母亲知道了此事后,就告诉他,只管把她约出来就好了。于是第二天,男孩鼓起了全部的勇气,像往常一样来到了店里。像过去那样,他还是买了一张CD,而女孩也还是走到后面,回来的时候再把包装好的CD交给他。男孩接了过来,趁女孩不注意,他把他的电话号码留在了桌子上,然后跑了出去… RRRRRING!!! “铃铃铃铃铃铃…” One day the phone rang, and the mother picked it up and said, "Hello?" 一天,电话响了起来。男孩的母亲接起电话说道,“你好?” It was the girl!!! The mother started to cry and said, "You don’t know? He passed away yesterday..." 是那个女孩!!!男孩的母亲开始哭了起来,说道:“你不知道吗?他昨天就去世了…” The line was quiet except for the cries of the boy's mother. Later in the day, the mother went into the boy's room because she wanted to remember him. She thought she would start by looking at his clothes. So she opened the closet. 电话里安静了下来,只听到男孩母亲啜泣的声音。之后,男孩的母亲来到了他的房间,缅怀她的儿子。男孩的母亲想先看一看男孩的衣物。于是她打开了男孩的衣柜。 She was face to face with piles and piles and piles of unopened CDs. She was surprised to find all these CDs and she picked one up and sat down on the bed and she started to open one. Inside, there was a CD and as she took it out of the wrapper, out fell a piece of paper. The mother picked it up and started to read it. It said: Hi... I think U R really cute. Do u wanna go out with me? Love, Jocelyn. 在她的面前,是一摞又一摞的CD。看到这么多的CD,男孩的母亲感到很惊讶。她随手拿出一张,坐在了男孩床上。她拆开了包装,把CD拿了出来。一张纸条掉了出来。男孩的母亲捡起了纸条,开始读起来。上面写着:你好…我觉得你真的很可爱。你想和我出去约会吗?爱你的,乔瑟琳。 The mother was deeply moved and opened another CD... 男孩的母亲被深深打动了,拆开了另一张CD… Again there was a piece of paper. It said: Hi... I think U R really cute. Do u wanna go out with me? Love, Jocelyn. 又发现了另一张纸条。上面写着:你好…我觉得你真的很可爱。你想和我出去约会吗?爱你的,乔瑟琳。 Love is... when you've had a huge fight but then decide to put aside your egos, hold hands and say, "I Love You." 爱就是…当你万般挣扎过后,把自我放到一边,握住对方的手,说:“我爱你。”
励志美文
刘航宇
5年前
4
548
2
2021-04-10
进程间有名管道通信,并可靠退出
摘要本文介绍了使用管道通信实现两个进程的单机双向通信,并确保可靠退出的方法。通过创建有名管道,并通过fork()创建子进程,实现了A端发送数据,B端接收数据的功能,并通过输入'q'结束所有进程。关键词:进程间通信, 管道通信, 双向通信, 可靠退出, Linux使用管道通信实现两个进程的单机双向通信,并保证可靠退出。免get函数,利用kill结束所有进程办法,小刘原创: 管道程序: 1.随意命名比如 vim g.c复制下面程序,在Linux系统浏览器可以输入本站网址sciarm.com,可以直接复制,不用敲代码。 2.然后 gcc g.c 3../a.out #include "stdio.h" int main() { int ret; ret = mkfifo("./first",0777); if(ret == -1) { printf("create first error\n"); return -1; } ret = mkfifo("./second",0777); if(ret == -1) { printf("create second error\n"); return -2; } return 0; }A端程序 1.同理创建 vim A.c 复制下面程序 2.gcc A.c -o A 3.然后 ./A #include "stdio.h" #include "fcntl.h" #include "string.h" int main() { int pid; int fd; int i; char buf[32] = {0}; pid = fork(); if(pid > 0) // write first { fd = open("./first",O_WRONLY,0777); if(fd == -1) { printf("open first error\n"); return -1; } while(1) { printf("please input send data\n"); scanf("%s",buf); write(fd,buf,strlen(buf)); if(buf[0] == 'q') { kill(pid,9); waitpid(pid,NULL,0); break; } for(i = 0 ;i < 32 ;i ++) { buf[i] = 0; } } close(fd); } if(pid == 0) // read second { fd = open("./second",O_RDONLY,0777); if(fd == -1) { printf("open error\n"); return -2; } while(1) { read(fd,buf,32) ; if(buf[0] == 'q') { kill(pid,9); waitpid(pid,NULL,0); break; } printf("recv from B %s\n",buf); for(i = 0 ;i < 32; i ++) { buf[i] = 0; } } close(fd); } return 0; }B端程序 打开另一个TM命令窗口,也要root模式下 1.同理创建 vim B.c 复制下面程序 2.gcc B.c -o B 3.然后 ./B #include "stdio.h" #include "fcntl.h" #include "string.h" int main() { int pid; int fd; int i; char buf[32] = {0}; pid = fork(); if(pid > 0) // write first { fd = open("./first",O_RDONLY,0777); if(fd == -1) { printf("open first error\n"); return -1; } while(1) { read(fd,buf,32); if(buf[0] == 'q') { kill(pid,9); waitpid(pid,NULL,0); break; } printf("recv from A %s\n",buf); for(i = 0 ;i < 32 ;i ++) { buf[i] = 0; } } close(fd); } if(pid == 0) // read second { fd = open("./second",O_WRONLY,0777); if(fd == -1) { printf("open error\n"); return -2; } while(1) { printf("please input send data\n"); scanf("%s",buf); write(fd,buf,strlen(buf)) ; if(buf[0] == 'q') { kill(pid,9); waitpid(pid,NULL,0); break; } for(i = 0 ;i < 32; i ++) { buf[i] = 0; } } close(fd); } return 0; }打开第三个窗口进入超管模式输入: ps -axj 可以看到4个进程 图片 A端:随便输入一些字符,B就能接收到,输入q,两者4个进程可以全面杀掉 图片 B端: 图片 再次输入: ps -axj 全部杀掉进程图: 图片
嵌入式&系统
# 嵌入式
刘航宇
5年前
3
700
12
2021-03-23
考研英语作文笔记-刘晓燕
摘要本文介绍了考研英语作文中常用的表达方式,包括简单句、并列句、复合句、特殊结构等,并提供了大量例句和写作技巧。关键词:考研英语作文, 刘晓燕笔记, 英语写作技巧, 句型表达, 写作满分文章目录 一、简单句的满分表达 被动 there be句型 比较句型 as...as...和...一样 (原级的比较) the more...the more....越....越.... 并列句满分表达 1、and but 句型 2、not only ....but also...句型 复合句的满分表达 一)主语从句 二)同位语和同位语从句 1、名词作同位语 2、同位语从句 三)定语和定语从句 1、定语的成分 2、定语和定语从句在写作中的使用 3、定语从句的满分表达 四)状语和状语从句 1、什么是状语 2、状语在写作中的使用 3、状语从句的满分表达 ①让步状语从句 ② so...that... 如此...以至于.... ③分词作状语把分词放在句中的主谓之间作为插入语使用 二. 英语的特殊结构的满分表达 1)插入语: 2)双重否定 3)强调句型 4)修辞 一. 比喻 二. 排比 5)虚拟语气 1、if 引导的虚拟语气 6)倒装 1、否定词放句首用倒装 2、so...that...的倒装 3、only+状语放句首用倒装 三、段落:段落的论证方式 1、定义和解释 2、统计和事实(推荐英语2) 3、引用名人名言 一、简单句的满分表达 被动 当汉语中出现我们、人们、大家或有人等人称代词做主语时,都可以写成被动。 被动句型推荐在第一段的最后一句话,引出文章中心时使用,或者是第三段的第一句话,文章总结的时候使用。(使用一次就够了) 举例1:我们应该孝敬父母 parent should be respected by us. superiors are supposed to be respected by their descendants. 单词替换: ①parent----->superiors(父母,长辈,上司)/ the elderly/ senior citizens. ②should----->ought to/ be supposed to(应该做)/ be obliged to(有责任有义务做,带强制的感情色彩) ③we、us和people的替换----->human beings/ the public/ private individuals 写作时要注意单词的准确性!!1 1)我们不应该盲目追星 我们------>teenagers and youngsters. 2)我们应该节约 undergraduates(本科生)、youngsters on campus(大学生) 3)我们应该孝敬父母 children/ kids/ offspring(子孙后代,单复数同形不加s)/ descendants(子孙后代) 4)人们应该讲诚信 businessmen 5)我们应该有自信 all children and adults/ men and women in all walks(各行各业的男男女女们) 6)我们应该关注环境问题 experts and professors 示例2、我们不应该盲目追星 celebrities (名人;明星) should not be pursued by youngsters. not的替换:------never /by no means/ under no circumstances/ fail to(★) 示例3、污染很严重 environmental contamination is though very serious by increasing amount of experts and professors. pollution-----> environmental contamination think------> maintain/ claim/assume/ be of the opinion that/ cling to the perspective that very-----> distinctly /remarkably/ exceedingly/ outstandingly/ strikingly/ extraordinarily [ɪksˈtrɔːdnrɪli] (选三个记忆) serious----> fatal/ grave/ severe/ fearful/ be of great severity there be句型 there exists/seem/remain(都翻译成有) 示例1: 有很多的原因解释我的观点 There exist many reasons to explain my idea. 本句型推荐写在第二段的第一节话引出原因分析的时候使用,或者是第三段的最后一句话喊口号的时候使用。 Many ----a sea of/ a multitude of/ a host of / a train of /an army of 许多、大量 -----immense(巨大的) amounts of -----numerous Reasons—causes/factors/elements Explain—account for /give rise to/contribute to/be responsible for 产生、导致、致使 Idea----outlook/viewpoint 比较句型 as…as…和…一样 (原级的比较) 只要作文中出现形容词或副词的地方都能写出as…as…句型 本句型推荐写在第一段的最后一句话引出文章中心的时候使用,或者是第三段第一句话,文章总结的时候使用。 示例1:她很漂亮 She is as beautiful as a red rose, which managed to take away the breath of a sea of children and adults. 她能成功带走很多人的呼吸。 be动词的替换(不适合被动和现在进行时,此时be作为助动词)------ ①look/taste/sound/feel…所有的感官动词都可以替换be动词 seem、 appear(好像,似乎) ②keep, remain ③become,get ④prove Beautiful----graceful/ elegant/ attractive/ charming/ gorgeous(美丽到极致) 示例2:自信很重要 Confidence proves as important as sunshine, which plays an essential role in the normal growth of all creatures. Important-----vital/crucial/critical/indispensable/significant ------be of great importance ------be of great importance 示例3:过渡捕捞很严重 Sth becomes as grave as AIDS,which has threatened the health of patients or taken away their lives. the more…the more…越…越… 这个句型叫做the+adj/adv比较级+句子,the+adj/adv比较级+句子。(主将从现哟!) the后面加形容词还是副词取决于后面这个句子的谓语动词是系动词还是实义动词,如果谓语是实义动词用副词,如果是系动词用形容词 本句型推荐写在作文的第二段分析原因的时候使用 Eg:文化交流的越频繁,经济发展越迅速 The more frequently cultures are exchanged, the more rapidly Chinese economy will develop. 可数名词永远不能单独使用,如果不确定是不是可数,加the最保险。 例句1:你爬的越高看的越远 (没有特指的一个人用one,没有特指的多个人用those) The higher one ascends , the farther he will overlook. (farther指真实距离的远,further指抽象距离的远) 例句2:你学习的越努力,你越容易取得成功。 (努力:diligent) The more diligent one keeps,the more easily he will achieve glories. 一句话需要动词又没有动词用be动词; keep是系动词后面跟形容词diligent,‘容易’是修饰‘取得’的,‘取得’是实义动词,副词修饰实义动词,使用副词easily。 例句3:越努力,越幸运。(所有人都是) The harder all children and adult remain, the more fortunate they will become. 作业:用the more …the more…句型写为什么做人一个有自信 并列句满分表达 1、and but 句型 And------->likewise/similarly/in the meanwhile/at the same time 都翻译为‘并且’ But-------->conversely/by contrast/On the contrary/ conversely/nevertheless都翻译为‘但是’ 描述图画的分类 1)一幅图 1、一幅图,一个主体,两个动作(主要/次要) 2、一幅图,两个主体,两个动作 2)两幅图 在描述图画的时候记住:除非有明显的过去时间,描述图画都用现在进行时,因为现在进行时描述更生动。 描述图画----一般现在时 描述图表----一般过去 In the picture, the goalkeeper is imagining himself exceedingly small. On the contrary, the player is assuming his rival(对手)as big as a hill. 在第一幅图画当中,温室里的花朵生长的很健康,但是在第二幅图画中,这朵花就凋零了。 In the former picture, the flower in the greenhouse is growing healthily. Conversely, in the latter one, it is dying. And but句型推荐写在作文的第一段,描述一幅图两个主体两个动作的时候使用,或者是两幅图的时候使用。 替换Picture----> picture/cartoon/drawing/painting/caricature/photograph 作业:描述追星这幅作文 2、not only …but also…句型 本句型推荐写在作文的第二段,分析原因的时候使用 例句1:养宠物的好处 养宠物能减少老人的孤单 Raising pets can reduce the loneliness of senior citizens. 养宠物能培养小孩子的善良 Raising pets can cultivate the kindness of kids. 合并: Raising pets not only can educe the loneliness of senior citizens but also can cultivate the kindness of kids. 例句2:为什么应该孝敬父母 孝敬父母不但是一个中华民族的传统美德,而且是子女的法定义务。 Supporting the elderly not only keeps a Chinese conventional virtue but also proves the legal responsibility of their offspring. 例句3:合作/自信/乐观/文化交流 不但能够使我们交到更多的朋友,而且还能使我们取得更大的成功。 Enable sb to do sth/ have sb do sth 使某人做某事 成功、成就、荣耀:glories 表扬、嘉奖、荣誉、荣誉、成就:credits Cooperation not only enables all children and adults to make more intimate friends but also has them achieve greater credits. 复合句的满分表达 一)主语从句 l (That you never fail to fascinate me) is obvious. It is obvious (that you never fail to fascinate me) 主语从句的满分表达就是把主语从句放到句末去,加it做形式主语。 主语从句常见的满分表达是it…that… It proves common knowledge that…显而易见,总所周知 It proves self-evident that… 显而易见,总所周知 It seems beyond dispute that…超越了争论---->显而易见,总所周知 It is universally acknowledged that…显而易见,总所周知 It has been widely accepted that… 显而易见,总所周知 It keeps my perspective that= i think that… 我认为 (选两个记忆----大作文写一个小作文写一个) 可以写在作文中任何一句话的前面来拉长句子 本句型推荐写在大作文第一段第一句话的前面,用来引出推荐的图画或图表。 更好的主语从句的变体是把it写成what,在that前面加is Eg: What proves common knowledge is that… 已经变成了两个从句:1、what引导的主语从句 2、that引导的宾语从句 二)同位语和同位语从句 1、名词作同位语 只要在作文中见到名词,都可以在后面加一个名词,作为它的同位语出现。 大作文最多出现两次名词作同位语。 My boyfriend, a rich businessman, really has no much time to accompany me, an attractive girl. 一个男人把贝克汉姆的名字写在他的脸上 A man,a soccer fan, is writing the name, a symbol of someone, of Beckham , an esteemed sportsman, on his face, some part of the body. 2、同位语从句 1、她长着一双大眼睛这个事实表明她是一个美女; The evidence( that she has a pair of big eyes )manifests(表明) (that she keeps a beauty.) 同位语从句+宾语从句 2、很多女生都已经穿上了漂亮的花裙子,这个事实表明夏天已经来了。 The evidence that a host of girls have wore beautiful colorful skirts manifests that summer is around the corner. …样的事实表明了… 本句型推荐写在作文第二段分析原因的时候使用,它的模板是the evidence that + 一个表示原因的简单句+ manifests that +文章的中心句。 为什么说污染很严重? 我们再也见不到明亮的星星和皎洁的月光了,这个事实表明污染变得越来越严重了。 The evidence that bright stars and pure moonlights fail to be detected manifests that environment contamination is becoming increasing fatal. 例句:国产车的价格变得越来越低了,这个事实表明国产车在中国更受到欢迎 他们能够享受到一个更高质量的生活水平,这个事实表明,更多的农民涌入大城市。 The evidence that farmers can enjoy high quality life, manifest that most of them would like to swarm into big cities. 三)定语和定语从句 1、定语的成分 ①形容词修饰名词 ②介词短语修饰名词 ③名词修饰名词 ④非谓语动词修饰名词 ⑤从句 2、定语和定语从句在写作中的使用 只要在作文中见到名词,都可以给它加一个定语的成分,把句子拉长。但是在第一段描述图画的时候只要见到名词通常都要加定语,使图画的描述显得很生动。 一个…美国小女孩正穿着少数民族的传统服饰 An American girl young as well as graceful is wearing Chinese conventional costume which keeps pervasive(遍布的,普遍的)in the south of China. Immense amounts of children and adults sitting in seperate rooms are surfing on the internet. 描述图画的万能定语: 1、好的: 用as well as连接两个形容词:cute,lovely,little; graceful elegant; young; Enthusiastic,passionate; confident,energetic; Aggressive ambitious Who looks distinctly impressive to readers(给读者留下深刻印象的—>万能定从) 2、坏的: Fat, cruel, ugly Negative, dispassioned 消极悲观的 Terrible, disgusting,disgraceful 不好的 Who looks rather less impressive to readers. 3、定语从句的满分表达 他是一个色狼是显而易见的 He looks like a lady-killer, which has been widely accepted. 定语从句的满分表达就是which可以引导修饰前面整个句子的定语从句,和前面的句子用逗号隔开。 定语从句的满分表达可以写在作文中任何一个陈述句后面,但是推荐写在中文第二段某个比较短的原因后面用来拉长句子。 1)which leaves us a deep impression 2)which provokes the public’s widespread concerns. 3)which brings up the unnecessary/unexpected trouble 4)which gives rise to dreadful consequences 国产车的价格变得越低,越多的人愿意买国产车 The lower the price of cars made in China becomes, the more Chinese would like to purchase them, which leaves businessmen a deep impression. 四)状语和状语从句 1、什么是状语 只要在句子中见到一下的一坨东西就是状语:adv,时间,地点,原因,条件,让步,方式,结果,目的,伴随,比较状语 2、状语在写作中的使用 中文中的任何一句话都可以加给它加一个状语的成分把句子拉长,但是在第一段描述图画或图表的时候一定要加状语,使图画或图表的描述更完整。 描述图画的万能状语 In the center of the vivid picture. 描述原因的万能状语 推荐写在那个原因的中间作为插入语使用 1、as every one can see it. 显而易见,总所周知 2、With the rapid advance of science and technology. 3、In our contemporary society目前 4、In the general routine of everyday living在我们日常生活中 3、状语从句的满分表达 ①让步状语从句 Although Although引导的让步状语从句可以写在作文中任何一句话的旁边,但是推荐写在第二段分析原因的时候使用。 第二段原因分析句型已经讲了:the more…the more…/not only…but also…/同位语从句/although引导的让步状语从句 第二段第一句话用there be 引出原因分析 为什么不应该盲目追星? 例句:盲目追星会影响青少年的身心健康 影响:exert great influence on Pursuing celebrities blindly might exert great influence on physical and mental health of youngsters on campus although their singing sounds touching. 发展中国家的人变得越来越富有了 Private individuals from developing nations are becoming increasingly wealthy although Although 引导的万能状语是: Although many people fail to pay attention the issue. 虽然很多人还没有关注到这个问题 Pay attention to 的替换(记两个) 关注,重视: Place great emphasis on; Attach great importance to; Shed light on; Pour attention into problem替换:issue phenomenon现象 subject话题 the current situation现状 ② so…that… 如此…以至于… 只要作文中出现形容词或副词的地方,都能写成so…that…句型,但是推荐写在第一段的最后一句话引出文章中心的时候使用或者是第三段的第一句话文章总结的时候使用。 已经推荐过 被动,as … as, so…that…可以写在第一段最后一句话和第三段第一句话 生命如此短暂,以至于如何的度过都是一种浪费 Life proves so short that it is a waste how to spend it. Sth keeps so vital that the problem should have been brought into the limelight. 带到聚光灯下 Sth becomes so fatal that the problem should have been brought into the limelight.引起我们关注 ③分词作状语把分词放在句中的主谓之间作为插入语使用 I hate you, i will kill you.(x) Hating you , i will kill you.(分词作状语) I, hating you, will kill you.(★) 本句型推荐写在作文的第一段,描述一幅图一个主体两个动作的时候使用。 它的模板是: sb(定语),doing sth1.(次要)+定/状,is doing sth2(主要)+定/状 A boy is smiling, a boy is rushing to the destination ------> A boy confident as well as vigorous(充满活力), smiling in the center of the vivid cartoon, is rushing to the destination which becomes a new start. 文化火锅 The hotpot delicious as well as health, smoking in the center of the vivid cartoon, is full of cultures from different nation in the world. 二. 英语的特殊结构的满分表达 1)插入语: 以下都是万能的插入语,可以插在任何一句话的主谓之间 本句型推荐写在第一段的最后一句话,第二段的第一句话或者是第三段第一句话的主谓之间 Needless to say显而易见,总所周知 In my judgement To my knowledge Exactly speaking To tell the truth To put it in another way换句话说 I suppose我认为 As i see it==in my opinion As we all know 2)双重否定 Never fail to 从来没失败过…---->没有意思表示强调(谓语),可以写在任何一个肯定句的主谓之间 双重否定推荐写在:同插入语(第一段的最后一句话,第二段的第一句话或者是第三段第一句话)用了双重否定就别用插入语了 3)强调句型 It is…that… 唯一不能强调谓语 Eg: I love the girl in a restaurant 有很多的原因解释这种现象: There exist numerous factors here to account for the phenomenon. ---->It is to account for the phenomenon that there exist numerous factors here . 作文中所有的句子都可以写成强调句型,但是推荐写在:同上(第一段的最后一句话,第二段的第一句话或者是第三段第一句话) 4)修辞 一. 比喻 Confidence is to humans as water is to fish. 自信对于人类来说就相当于水对于鱼来说一样 sth很重要。(confident可替换) Sth1 is to 人 Sth proves to 人 as solid foundation is to high skyscrapers.就像坚固的地基对高楼大厦同样重要 As the foundation is to high skyscrapers. As mothers are to little babies. As the infinite blue sky is to flaying eagles. 就像剧烈的病痛对于晚期的病人同样严重 Sth proves to 人 as intensive pain is to incurably ill patients as horrible nightmares are to innocent kids. 比如:就像经济危机对于一个国家的经济发展一样严重。 xxx很严重 本句型推荐写在第一段的最后一句话引出文章中心的时候使用或者是第三段第一句话文章总结的时候时候。 这个图画告诉我们一个道理就是城镇化进程对一个国家就像坚固的地基对高楼大厦同样重要 二. 排比 总之我们应该采取措施 Action is supposed to be adopted quickly, effective and actively It is quickly, effective and actively that action is supposed to be adopted 定语从句的排比: 本句型推荐写在第三段最后一句话喊口号的时候使用(罗斯福那句话) 5)虚拟语气 1、if 引导的虚拟语气 如果你要远行,我会掩上所有的窗户 If you travel to a long distance , i will close all my windows. —>if you traveled to a long distance , i would close all my windows. 本句型推荐写在作文第二段最后一句话,反面论证的时候使用,或者是第三段的第一句话文章总结的时候使用。 如果每个人都沉迷于网络 abandon oneself to doing sth沉迷于做某事 If every one of teenager and youngster abandoned himself to surfing on the internet, he would pay a heavy price in the near future(万能). 单复数不一致问题 (every用单数) Be indulged in 沉溺(迷)于做某事 Be addicted to abandon oneself to doing sth If every university student were indulged in surfing on the internet, it would be hard for them to graduate smoothly. It is imperative/ essential/ urgent that… …很紧急,很重要 本句型推荐写在作文第三段具体措施的时候使用。 让父母采取措施(很多人都会写政府) 从小教育孩子支持国货是很重要的 should+V原表示虚拟 It is urgent that kids should be educated/inspired to support Chinese goods 6)倒装 把一句话写成一般疑问句的形式 1、否定词放句首用倒装 ①我从来不是一个彪悍外向的女人。 I am never a woman tough and outgoing. Never am i a woman tough and outgoing. ②他不但看起来很贫穷,而且事实上他的内心也很贫穷 He not only looks poor but also in fact is poor in his mind. Not only does he looks poor but also in fact is poor in his mind. ③Respecting parents keeps not only a Chinese conventional virtue but also proves the duty of their offspring. —>not only does respecting parents keep a Chinese conventional virtue but also proves the duty of their offspring. ④Confidence not only can make you find more happiness in your life but also can have you make more friends. —>not only can confidence make you find more happiness in your life but also can have you make more friends. 2、so…that…的倒装 把so引导的部分放句首用倒装 我妈妈很善 My ma is so kind that she will never kill an ant. —>So kind is my mother that she will never kill an ant. 我很开心 I am so delighted that i cannot help laughing at midnight. So delight am i that i cannot help laughing at midnight Sth keeps so significant/fearful that the issue should have been brought into the limelight. —> so fearful/significant does sth keep that the issue should have been brought into the limelight. 3、only+状语放句首用倒装 只有通过采取这些措施,这个问题才能得到改善。 Only by taking those action can the issue be improvement a lot. 只有这个问题得到改善,人们才能安居乐业 [Only when the issue can be improved a lot ]can the common lead a happy and comfortable life. 三、段落:段落的论证方式 段落论证方式也就是写作无话可说的时候怎么办。 1、定义和解释 什么是追星? Pursuing stars is a social trend which means that we listen to their songs, we buy their CDs and we imitate their hairstyle when we have passion for them. (排比主语句式最好一致) 什么叫孝敬父母? 好事----一个中华民族传统美德 坏事----全世界普遍存在的问题/话题 Supporting the elderly is a Chinese conventional virtue(传统美德)which means that we cook for them, we buy gift for them and we wash feet for them when they become gradually old. 定义和解释用在第一个原因分析 A server global issue An active/ negative mentality心态 Sth1 is sth2 a Chinese tradition virtue + which means that+三个并列简单句 A hot social topic (主语一致) A social pervasive trend普遍趋势 when引导的时间状语从句 污染是什么? 2、统计和事实(推荐英语2) In light of=on the basis of=in line with根据;按照 Lastest=current=proximate 最新的;最近的 Statistics/survey/data/data统计 In light of lastest statistics by the Chinese academy of social science(中科院),an increasing amount of us harbor the idea that… By the department of social science in Peking university社会科学学院 harbor the idea that=think 持…观点 A recent study revealed the shocking /surprising/ delightful fact that…+中心句 3、引用名人名言 Once, there seemed a writer who has gained great reputation in Japan stating that: 推荐句型 ①比喻 ②as…as ③the more…the more句型 ④so…that… ⑤if虚拟语气
我的随笔
刘航宇
5年前
0
2,308
3
2021-03-14
liunx系统创建并运行实战一个c程序及常用指令指导
摘要本文介绍了在Linux系统下创建并运行C程序的方法,包括进入超级管理员模式、使用Vim编辑器编写代码、使用gcc编译器编译代码、运行编译后的程序等步骤。同时,还列举了Linux系统中的常用指令和vi编辑器的使用方法。关键词:Linux, C程序, 编程实战, 命令指导, 系统管理{mtitle}liunx系统运行实战一个c程序{/mtitle} 学习liunx系统有利于嵌入式、云服务器等学习。 下面我们实战创建并运行一个三角图形c程序 首先 su rooot 进入超级管理员模式 如果你没有超级管理员账号,想搞一个可以看本站嵌入式其他帖子创建永久超级管理员账号办法,或者按课本上代码临时进入root模式 然后输入 ls 指令查看目录 然后输入 cd 你选的目录名 创建c程序 vim test.c 键盘“a”键可以直接进入编辑模式 输入代码例如: #include <stdio.h> int main() { int i,j,n; printf("input ranks n\n"); scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n-i-1;j++) printf(" "); for(j=0;j<=i;j++) printf("*"); printf("\n"); } return 0; }或者更换 for(i=0;i<n;i++) { for(j=0;j<n-i-1;j++) printf(" "); for(j=n-i-1;j<n;j++) printf("*"); printf("\n"); }输入完C代码后,记得“ESC”键切换,输入“:wq”保存退出 然后gcc test.c 打完gcc test.c编译完C源文件。然后就可以看见a.out的文件。一般linux系统就默认为a.out为编译完的文件。现在运行a.out文件。在a.out文件的目录下打开终端并输入 ./a.out 就是运行文件了。 示例图解: 图片 对于回文数可以参考下面代码,我们不妨先取倒序,将本数先输出,再输出倒序数则生成回文数。要让计算的结果倒序输出.现总结一下思路: 1.如果要把一个数倒序输出,即对10求模,可以得到尾数; 2.然后将这个数除以10;这样个位就被舍去;然后如此循环即可 3.直到求模结果为0;证明这个数已经求到个位; #include <stdio.h> int main() { int h; printf("Enter the number\n"); scanf("%d",&h); if(h==0) { printf("%d",h); } printf("%d",h); while(h>0) { printf("%d",h%10); h=h/10; } return 0; } 参考图例: 回文数图片 {mtitle}Linux基本命令{/mtitle} uname -a 查看内核版本 ls -al 显示所有文件的属性 pwd 显示当前路径 cd - 返回上一次目录 cd ~ 返回主目录 date s 设置时间、日期 cal 显示日历 cal 2006 bc 计算器具 man & info 帮助手册 locale 显示当前字体 locale -a 所有可用字体 /etc/sysconfig/i18n设置文件 LANG=en 使用英文字体 sync 将数据同步写入硬盘 shutdonw -h now & half & poweroff 关机 reboot 重启 startx & init 5 进入图形介面 /work & ?work 向上、下查找文档内容 chgrp 改变档案群组 chgrp testing install.log chown 改变所属人 chown root:root install.log chmod 改变属性 chmod 777 install.log read=4 write=2 execute=1 cp 复制 cp filename rm 删除文件 rm -rf filename 强制删除文件 rmdir 删除文件夹 mv 移动 mv 123.txt 222.txt 重命名 mkdir 创建文件夹 touch 创建文件 更新当前时间 cat 由第一行开始显示 cat |more 分页 nl 在内容前加行号 more & less 一面一面翻动 head -n filename 显示第N行内容 tail -n filename 显示后N行内容 od 显示非纯文档 df -h 显示分区空间 du 显示目录或文件的大小 fdisk 分区设置 fdisk -l /dev/hda 显示硬盘分区状态 mkfs 建立各种文件系统 mkfs -t ext3 /dev/ram15 fsck 检查和修复LINUX档案 ln 硬链接 ln -s 软件链接 whereis 查找命令 locate 查找 find 查找 find / -name "." which 查看工具 whoami 显示当前用户 gcc -v 查看GCC版本 chattr +i filename 禁止删除 chattr -i filename 取消禁止 lsattr 显示隐藏档属性 updatedb 更新资料库 mke2fs 格式化 mkfs -t ext3 dd if=/etc/passwd of=/tmp/passwd.bak 备份 mount 列出系统所有的分区 mount -t iso9660 /dev/cdrom /mnt/cdrom 挂载光盘 mount -t vfat /dev/fd0 /mnt/floppy 挂载软盘 mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2 挂载fat32分区 mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3 挂载ntfs分区 umount /mnt/hda3 缷载 ifconfig 显示或设置网络设备 service network restart 重启网卡 ifdown eth0 关闭网卡 ifup eth0 开启网卡 clear 清屏 history 历史记录 !55 执行第55个指令 stty 设置终端 stty -a fdisk /mbr 删除GRUB at 僅進行一次的工作排程 crontab 循環執行的例行性命令 [e]编辑,[l]显示,[r]删除任务 & 后台运行程序 tar -zxvf 123.tar.gz & --------->后台运行 jobs 观看后台暂停的程序 jobs -l fg 将后台程序调到前台 fg n ------>n是数字,可以指定进行那个程序 bg 让工作在后台运行 kill 结束进程 kill -9 PID [9]强制结束,[15]正常结束,[l]列出可用的kill信号 ps aux 查看后台程序 top 查看后台程序 top -d 2 每两秒更新一次 top -d 2 -p10604 观看某个PID top -b -n 2 > /tmp/top.txt ----->將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt pstree 以树状图显示程序 [A]以 ASCII 來連接, [u]列出PID, [p]列出帐号 killall 要刪除某個服務 killall -9 httpd free 显示内存状态 free -m -------->以M为单位显示 uptime 显示目前系统开机时间 netstat 显示网络状态 netstat -tulnp------>找出目前系統上已在監聽的網路連線及其 PID dmesg 显示开机信息 demsg | more nice 设置优先权 nice -n -5 vi & ----->用 root 給一個 nice 植為 -5 ,用於執行 vi renice 调整已存在优先权 runlevel 显示目前的runlevel depmod 分析可载入模块的相依性 lsmod 显示已载入系统的模块 modinfo 显示kernel模块的信息 insmod 载入模块 modprobe 自动处理可载入模块 rmmod 删除模块 chkconfig 检查,设置系统的各种服务 chkconfig --list ----->列出各项服务状态 ntsysv 设置系统的各种服务 cpio 备份文件 压缩命令: *.Z compress 程式壓縮的檔案; *.bz2 bzip2 程式壓縮的檔案; *.gz gzip 程式壓縮的檔案; *.tar tar 程式打包的資料,並沒有壓縮過; *.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮 compress filename 压缩文件 加[-d]解压 uncompress gzip filename 压缩 加[-d]解压 zcat 123.gz 查看压缩文件内容 bzip2 -z filename 压缩 加[-d]解压 bzcat filename.bz2 查看压缩文件内容 tar -cvf /home/123.tar /etc 打包,不压缩 tar -xvf 123.tar 解开包 tar -zxvf /home/123.tar.gz 以gzip解压 tar -jxvf /home/123.tar.bz2 以bzip2解压 tar -ztvf /tmp/etc.tar.gz 查看tar内容 cpio -covB > [file|device] 份份 cpio -icduv < [file|device] 还原 深圳-广州-郑州-长沙嵌入式系统实训,凡通过本帖添加咨询报名学习可免费赠送学习现金卷及学习资料一份。详情联系郭老师QQ754634522 vi一般用法 一般模式 编辑模式 指令模式 h 左 a,i,r,o,A,I,R,O :w 保存 j 下 进入编辑模式 :w! 强制保存 k 上 dd 删除光标当前行 :q! 不保存离开 l 右 ndd 删除n行 :wq! 保存后离开 0 移动到行首 yy 复制当前行 :e! 还原原始档 $ 移动到行尾 nyy 复制n行 :w filename 另存为 H 屏幕最上 p,P 粘贴 :set nu 设置行号 M 屏幕中央 u 撤消 :set nonu 取消行号 L 屏幕最下 [Ctrl]+r 重做上一个动作 ZZ 保存离开 G 档案最后一行 [ctrl]+z 暂停退出 :set nohlsearch 永久地关闭高亮显示 /work 向下搜索 :sp 同时打开两个文档 ?work 向上搜索 [Ctrl]+w 两个文档设换 gg 移动到档案第一行 :nohlsearch 暂时关闭高亮显示 认识SHELL alias 显示当前所有的命令别名 alias lm="ls -al" 命令别名 unalias lm 取消命令别名 type 类似which exprot 设置或显示环境变量 exprot PATH="$PATH":/sbin 添加/sbin入PATH路径 echo $PATH 显示PATH路径 bash 进入子程序 name=yang 设定变量 unset name 取消变量 echo $name 显示变量的内容 myname="$name its me" & myname='$name its me' 单引号时$name失去变量内容
嵌入式&系统
# 嵌入式
刘航宇
5年前
2
549
2
2021-03-11
[刘晓燕]作文笔记
摘要本文概述了考研英语写作的概述、评分原则、满分表达和练习。强调语言准确性、结构逻辑性和内容的重要性,并提供了一些写作技巧和句型。关键词:考研英语写作, 写作技巧, 评分原则, 语法结构, 表达练习第一节概述 一、写作概述 大作文: 图画、图表 18行,用时25min 小作文: 应用文:私人书信、公务书信、告示。 10行左右,包含落款等 做题时间顺序及分配: 1.写作40min 2.阅读90min 3.新题型英语二10min,英语一15min 4.翻译20min 5.完形15min 建议不要检查纠结。 二、评分原则和方法 语言第一 原则一:书写工整,卷面整洁,字迹清晰 原则二:语言第一:单词(背单词)语法正确、准确多遍 离考前3个月都来的及 结构第二: 1)总分总 2)写作中只要上下句有逻辑关系,必须用逻辑关系词,代词代替名词 内容第三: 内容一点也不重要 三、考研中相关问题 1.语域问题 a 缩写词不正式 b 泛指的不定代词you,在正式文体中写成one you never know what measures the president will take. c 正式问题的引导词that不可省略 d 插入语使句子更正式 第二节 写作满分表达和练习 一) 简单句 我们应该孝敬父母 We should respect our parents. 被动 我们,我,你们等人称代词做主语可换被动 Parents should be respect by us. 父母长辈可替换: Parents Superiors The elderly Senior citizens 应该 Should Ought to Be supposed to Be obllged to Us替换 We us peope: Human beings Private individuals The folks masses 孩子 children kids descendant 年轻人 Youngsters and teenagers Youngsters on campus Undergraduates 专家教授 Experts and professors All children and adults Men and women in all walks 各行各业的男男女女们 Customers 我们不应该盲目追星 Superstars ought not to be pursued blindly by teenagers and youngsters. Not Never By no means Under no circumstances Fail to 污染很严重 The pollution is very serious. 升级: Pollution is thought very serious by an increasing number of experts and professors. Think替换 Hold argue contend assume presume insist maintain assert claim 认为 be of the opinion that have been convinced that cling to the perspective that 非常very替换 Pretty;quite;more than 本句型推荐第一段最后一句话,引出文章中心!或者第三段第一句话,文章总结使用。 二) 并列句 三) 复合句 四) 英语的特殊结构 Idea替换 Point viewpoint Outlook Perspective Argument There is strong evidence to show that… 有确凿的证据表明 There is a growing worldwide awareness around the world that… =more and more people think that… 2比较结构 1) As…as…作文出现adj or adv都可考虑as…as…句型,推荐第一段最后一句,引出文章中心,或者第三段文章总结使用。 Liu is very beautiful Liu is as beautiful as a white lily,which manages to (catch the eyes抓住眼睛) of a host of teenagers and youngsters. Be动词替换, look、smell、taste、feel sound、 seem、appear、prove. Become get Keep remain Beautiful替换 Attractive;granceful;charming;elegant;gorgeous 自信很重要 Confidence keeps as important as air and water. Which plays a key role in the normal growth of all creatures in the world.
我的随笔
刘航宇
5年前
1
837
3
上一页
1
...
6
7
8
9
下一页