🌍首页
📁归档
⏳时光机
🚩友链
📫留言
📧订阅
🌟推荐
📕考研课程
🏜️ 免费壁纸
❤ 捐助本站
💰资助名单
🎵音乐实验
Search
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
20,264 阅读
2
论文写作中如何把word/wps里面所有数字和字母替换为新罗马字体
10,790 阅读
3
【高数】形心计算公式讲解大全
9,138 阅读
4
Vivado-FPGA Verilog烧写固化教程
8,204 阅读
5
【概论】一阶矩、二阶矩原点矩,中心矩区别与概念
7,923 阅读
🪶微语&随笔
励志美文
我的随笔
工作办公
📡电子&通信
嵌入式&系统
通信&信息处理
编程&脚本笔记
⌨️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
/
注册
ed(共165篇)
找到
165
篇与
ed
相关的结果
- 第 11 页
嵌入式视频流指南-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,594
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
761
4
2021-06-21
嵌入式liunx系统程序讲解-提高篇
摘要本文介绍了嵌入式Linux系统程序提高篇,包括进程与LED亮灯、系统频率问题分析等内容,建议在Bilibili观看高清视频学习。关键词:嵌入式Linux系统, 程序讲解, 进程管理, LED亮灯, 系统频率建议带上书做好笔记,推荐用平板或者电脑观看清晰 进程与LED亮灯、系统频率问题分析 建议用下面哔哩哔哩按钮观看高清的 其实我是一个没人知道的UP主,你可以哔哩哔哩进入观看: 记得一键三连哦!! 点击进入哔哩哔哩观看 学习文档 SCIARM网盘-嵌入式知识点 下载地址:http://d0.ananas.chaoxing.com/download/d5331ea7f40979dd6e23f47bc246ba13?at_=1624287730174&ak_=75c5f6e3d51e501ed1d296576279a5a1&ad_=2c2809d62da9e564694d382b807b5e74&fn=%E4%B8%8A%E8%AF%BE%E6%96%87%E6%A1%A3 提取码: 喜欢请收藏本站网址http://sciarm.com/ 有问题建议在此贴下使用真实邮箱留言,我回复后系统会有邮件提醒的。
嵌入式&系统
刘航宇
5年前
0
439
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
905
2
2021-06-10
Linux sleep函数
摘要Linux sleep函数用于挂起程序执行,分为秒级sleep和微秒级usleep。sleep以秒为单位,usleep以微秒为单位。Linux下还有delay函数,延时msec*4毫秒。关键词:Linux,sleep函数,usleep,挂起,休眠函数名: sleep、usleep 功 能: 执行挂起一段时间 头文件: #include <unistd.h> 区 别: unsigned int sleep (unsigned int seconds);//n秒 int usleep (useconds_t usec);//n微秒 Linux下的sleep函数原型为: unsigned int Sleep(unsigned int seconds); 而MFC中的Sleep函数原型为: void Sleep(DWORD dwMilliseconds); 也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微秒为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。 Linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250)。
嵌入式&系统
# 嵌入式
刘航宇
5年前
0
1,393
1
嵌入式与应用知识点学习&复习提纲
摘要本文为嵌入式与应用知识点学习复习提纲,涵盖嵌入式系统分层、特点、gcc编译、Linux命令、Vi编辑器、数组指针、文件IO、进程、有名管道、socket、CPU、SOC等知识点,并提供相关代码示例。关键词:嵌入式系统, 嵌入式处理器, GCC编译, 文件IO, 管道程序自己整理的复习提纲 目录 部分程序讲解 培养目标1提示联网和UI必须答,不答0分,少答扣分 培养目标2 培养目标3 培养目标4 培养目标5 培养目标6 培养目标7 LED会有变动,后面有时间出教程,希望能先理解下面程序这个是什么意思 培养目标8 部分程序讲解 培养目标1 1.嵌入式系统分三层:应用、内核、硬件层。ARM为硬件层、驱动内核层。 2.嵌入式系统与PC的区别 讲解:嵌入式系统一般指非 pc 系统,有计算机功能但又不称之为计算机的设备或器材。它是以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。简单地说,嵌入式系统集系统的应用软件与硬件于一体,类似于 pc 中 bios 的工作方式,具有软件代码小、高度自动化、响应速度快等特点,特别适合于要求实时和多任务的体系。嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成,它是可独立工作的“器件”。 答案:下面3点缺一不可 隐藏内容,请前往内页查看详情 3.嵌入式系统的特点 1)联网:嵌入式设备支持网络连接,可实现物联。 2)UI:嵌入式设备更多的采用是自定义的简单UI。 提示联网和UI必须答,不答0分,少答扣分 3)包含专用调试电路 4)具有完整的系统测试和可靠性评估体系 培养目标2 4.gcc编译hello.c为hello 答: gcc hello.c -o hello或 gcc -o hello hello.c 5.Linux 删除文件夹命令和CD命令含义 rmdir 目录 或者“rm -rf /目录” cd命令:切换当前目录至其它目录。 知识点补充: 隐藏内容,请前往内页查看详情 6.【判断题】Vi有三种基本工作模式:写程序在文本输入模式。 (对) 知识点补充: 隐藏内容,请前往内页查看详情 培养目标3 7.int p[n]:数组;int *p[n]指针; 必考补充:数组指针和指针数组区分: 隐藏内容,请前往内页查看详情 培养目标4 8.文件IO中write返回正确值为:向内核文件fd中写的字节数 参考P84 培养目标5 9.程序分析题 (1)运行时间小于20秒有几个进程? (2)什么是僵尸进程?什么孤儿进程,20秒后会产生什么? #include "stdio.h" #include "stdlib.h" int main() { int i; int pid; pid = fork(); if(pid > 0) { while(1); } if(pid == 0) { for(i=0;i<20;i++) { printf("我爱刘航宇%d次了\n",i); sleep(1); } } return 0; }答: 隐藏内容,请前往内页查看详情 培养目标6 10.创建有名管道文件函数是: mkfifo pEQzCid.png图片 11.有名管道,管道文件名chat.txt,编写A.c与B.c单向聊天 (1)B发A收 (2)程序具备退出功能 答:本题不要求实现过程可以不写,只写程序,至于过程学习参考本站其它文章 管道程序: #include "stdio.h" int main() { int ret; ret = mkfifo("./chat.txt",0777); if(ret == -1) { printf("mkfifo error\n"); return -1; } return 0; }A端程序:(收方!!!) #include "stdio.h" #include "fcntl.h" #include "string.h" int main() { int fd; int i; char buf[32] = {0}; fd = open("./chat.txt",O_RDONLY,0777); if(fd == -1) { printf("open error\n"); return -1; } //start read while(1) { read(fd,buf,32); if(buf[0] == 'q') { break; } printf("buf = %s\n",buf); for(i = 0 ;i < 32; i++ ) { buf[i] = 0; } } close(fd); return 0; }B端程序(发方): 隐藏内容,请前往内页查看详情 培养目标7 12 socket函数,UDP通信,参数: int type赋值为 SOCK_DGRAM 13 SOC全称是 System on Chip称为芯片级系统或片上系统 14 判断:AHB总线下挂接都是高速模块,如LCD控制器、中断控制器等 (×) 15 判断ARM 公司不生产芯片 (√) 16 简答:CPU、SOC和嵌入式产品关系: 三个要点:1 CPU是一台计算机的运算核心和控制核心。(第一句必答,后面可以简写)CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。主要功能是解释计算机指令以及处理计算机软件中的数据。计算机的可编程性主要是指对中央处理器的编程。2.SOC单片系统或片上系统是一个将电脑或其他电子系统集成到单一芯片的集成电路。(第一句必答,后面可以简写)单片系统可以处理数字信号、模拟信号、混合信号甚至更高频率的信号。单片系统常常应用在嵌入式系统中。单片系统的集成规模很大,一般达到几百万门到几千万门。SoC 可以基于 MCU 或 MPU,并将提供执行某些类型的应用程序所需的一切。隐藏内容,请前往内页查看详情 17.综合题:LED问题(本文推荐用电脑或平板观看,手机可能看不清) 预测题目:点亮GPF4的LED灯,实现其亮灭,将下面程序3个空区域补充完整。 (去年题目是点亮GPF4、5、6。看明白下面程序后可以同学自行尝试做一下,不过据说今年考点亮一个) 平台原理图: pEQzPJA.png图片 例图: 图片 控制与数据端口 pEQzFzt.png图片 程序:(可能与部分同学拍的略微不同,但是程序是一个意思,变量我图快方便写换了一部分,不影响,while循环改成for也是一个道理,这个东西很灵活 ::(勉强) ) //#include "global.h" #define GPFCON 0x56000050 #define GPFDAT 0x56000054 #define MPLLCON 0x4C000004 #define CLKDIVN 0x4C000014 void init_system_clock() { int *p; p = (int *)CLKDIVN; *p = 0x03; // FCLK:HCLK:PCLK=4:2:1, HDIVN=1,PDIVN=1 __asm__ { mrc p15, 0, r1, c1, c0, 0 orr r1, r1, #0xc0000000 mcr p15, 0, r1, c1, c0, 0 } p = (int *)MPLLCON; *p = (0x5c<<12)|(0x01<<4)|(0x02); } void mymain() { int *p; int i; init_system_clock(); //FCLK:HCLK:PCLK=200:100:50MHZ (1)------------ while(1) { (2)------------ for(i = 0 ;i < 10000; i ++); (3)------------ for(i = 0 ;i < 10000; i ++); } return ; }解答: 隐藏内容,请前往内页查看详情 培养目标8 18.rmmod功能:将驱动程序从liunx内核卸载;lsmod:查看内核中存在哪些模块 19.判断:驱动程序设备号分主设备号和次设备号 (√) 20.判断:驱动程序和应用程序一样有main函数 (×) 觉得本文对你有帮助,请点赞哦
嵌入式&系统
刘航宇
5年前
263
6,509
76
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,445
7
2021-06-02
【高数】三角函数与e指数函数的积分超6解法
摘要本文介绍了三角函数与e指数函数的积分超6解法,通过欧拉公式将指数函数和三角函数相乘的被积函数统一成指数函数形式,简化了积分过程。关键词:高数, 三角函数, 指数函数, 积分, 欧拉公式例题 ∫e∧(-2x)sinxdx 1.常规分布积分法: 图片 2.(新办法)当被积函数为指数函数和三角函数相乘时,通过欧拉公式可将被积函数统一成指数函数形式 图片
我的随笔
刘航宇
5年前
0
5,699
12
2021-05-27
通信原理—樊昌信第七版思维导图
摘要本思维导图是《通信原理》第七版的最简提纲,供读者结合课本扩展知识点使用,并鼓励手写笔记,同时提供高清PDF下载链接。关键词:通信原理, 樊昌信, 思维导图, 下载, PDF通信原理思维导图 本导图仅仅是最简提纲,请自行结合课本扩展知识点 请勿截图电子版,请务必认真手写! 思维导图高清PDF下载 TIIE云盘—通信原理思维导图 下载地址:http://d0.ananas.chaoxing.com/download/d410f1b0c2967f6712f1fecc14ebb87d?at_=1622097687188&ak_=f1f6a18cdf3f13f1af57dd57fd6035c4&ad_=c62f9762eb479cb7ba2c9f707c66c854&fn=%E9%80%9A%E4%BF%A1%E5%8E%9F%E7%90%86%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE 提取码:
通信&信息处理
刘航宇
5年前
0
4,130
5
数字图像处理学习笔记
摘要本文介绍了数字图像处理中的多种算法和概念,包括SUSAN角点检测、边缘检测、图像匹配、图像缩放、图像处理层次、滤波器应用等,并提供了相应的原理和示例。关键词:数字图像处理, SUSAN角点检测, 边缘检测, 直方图匹配, 图像缩放 1.简述SUSAN角点检测算法的原理。对于如下图所示的大的尖角,设计一种估测其角度的方法 原理: SUSAN算法是一种直接利用灰度值进行角点检测的算法,它基于一个圆形模板,统计以每个像素为中心的模板邻域的灰度值与中心点灰度值相近点的个数。 估测办法: 1)先选取半径为R1圆形模板如下图1所示,将选取模板进行在图像的每个像素点上移动; 2)当模板核子位于图像中亮度一致的区域内时,SUSAN面积最大,其值为圆形模板的面积,随着模板核子离图像边缘越来越近,其面积越来越小。 3) 当模板中心靠近角点时,其面积值进一步减少,当模板中心落在角点上时,其面积达到局部最小值。 4) 根据C(r0,r)以及面积占比关系得出角度α1,然后分别选取R2、R3、R4模板重复以上过程,记录角度α2,α3,α4,α等于4个取平均 图片 2.简述利用一阶差分算子、二阶差分算子对图像边缘进行检测的依据;边缘检测中,为了减少噪声对边缘检测产生的影响,可采取那些措施? 检测依据: 边缘是图像上灰度变化最明显的地方,边缘检测利用此特点,对图像各像素点进行求微分或二阶微分来定位边缘像素点。由灰度变化特点,可将边缘类型分为阶梯状、脉冲状和屋顶状三种。对于阶梯状,图像边缘点对应一阶微分图像的峰值和二阶微分图像的零交叉处;对于脉冲状和屋顶状边缘,边缘点对应一阶导数的零交叉和二阶导数的峰值。如图2所示。其中边缘检测算子是利用图像边缘的突变性质来检测边缘的。主要分为两种类型,1)一阶导数为基础的边缘检测算子,通过计算图像的梯度值来检测图像边缘,如:差分边缘检测、Roberts 算子、Sobel 算子、Prewitt 算子;2)二阶导数为基础的边缘检测算子,通过寻求二阶导数中的过零点来检测边缘, 如:Laplacian 算子、LOG 算子、Canny 算子。 图片 使用该权值矩阵(高斯核)对图像做“卷积”(协相关,对应位置相乘最后求和得到一点的像素值),得到新的图像矩阵。 3.在采用直方图匹配的方法进行图像匹配时,出现如下图所示的结果(原图为彩色)。试分析: 图中哪些匹配结果是正确的,哪些是错误的? 试设计出避免错误匹配的改进方法。 图片 4.图像的数据量与哪些因素有关?试阐述采样与量化所遵循的一般原则 答: (1)图像分辨率;采样率;采样值。 (2)采样原则:采样是把空域上或时域上连续的图像(模拟图像)转换成离散采样点(像素)集合(数字图像)的操作,这些值可以是均匀间隔也可以是。采样越细,像素越小,越能精细地表现图像。 量化原则: 量化是把像素的灰度(浓淡)变换成离散的整数值的操作。量化越细致,灰度级数(浓淡层次)表现越丰富。 5.设计一组3×3模板,使其可以用于检测二值图像中的各种角点。 图片 6.在图像比例缩放变换中, 如果放大倍数太大, 按照最近邻域法处理会出现马赛克效应。 该问题有无办法解决或改善?如果有,请给出方案。 答: 有,方案:比例缩放所产生的图像中的像素可能在原图像中找不到相应的像素点,需要进行插值处理。 (1)最邻近法,以最邻近像素插入缺口即可 (2)双线性插值法更好,求出周围4个像素点距离比,根据该比率,由4个领域的像素灰度值进行双线性插值。 7.试阐述图像处理学三个层次的基本内容及相互关系。 图片 8.试讨论用于图像平滑处理的滤波器与用于图像锐化处理的滤波器之间的区别与联系。 答:1.相同点:都能减弱或消除傅里叶空间的某些分量,而不影响或较少影响其他分量,从而达到增强某些频率分量的效果。 2.不同点:频率滤波器减弱或消除了傅里叶空间的高频分量,所以达到了增强某些低频分量、平滑图像中细节的效果。锐化滤波器减弱或消除傅里叶空间的低频分量,所以达到了增强了高频分量、锐化图像中细节效果。 3.联系:两者效果相反,互为补充,从原始图像中减去平滑滤波器的结果得到锐化滤波器的效果,而从原始图像中减去锐化滤波器的结果则可以得到平滑滤波器的效果。 9.根据下列要求作图: (1) 画出用1个半径为2的圆形结构元素膨胀1个8×8的正方形的示意图; (2) 画出用1个半径为2的圆形结构元素腐蚀1个8×8的正方形的示意图。 结构元素的参考点为圆形结构的中心点。 图片 10 对于下图所示的边界,计算其8方向链码及差分链码。 图片 有任何问题或者批评建议可以评论留言或者QQ与我交流
通信&信息处理
刘航宇
5年前
8
1,325
14
2021-05-01
matlab实现灰度图像空间域滤波
摘要本文介绍了使用Matlab实现灰度图像空间域滤波的方法,包括均值、中值和高斯滤波,并比较了不同滤波方案的效果。实验通过读取图像、添加噪声、应用不同滤波器,展示了滤波前后图像的变化。关键词:matlab, 灰度图像, 空间域滤波, 均值滤波, 中值滤波实验目的:掌握采用图像灰度图像空间域平滑、去噪的一般方法方法,并编程实现。 实验内容:编程实现灰度图像空间域滤波:至少包括 3×3、5×5窗口的均值滤波与中值滤波,并比较不同方案增强后的效果及影响因素。 实验平台:Matlab 实验代码: %matlab实现灰度图像空间域滤波,自定义窗口的均值、中值、高斯滤波,189064238刘航宇 try %步骤一:彩色、灰度变换 h=imread('D:\图片\image\liu.jpg'); %读入彩色图片 subplot(2,2,1),imshow(h);title('原图'); %显示原图像 c=rgb2gray(h); %把彩色图片转化成灰度图片,256级 subplot(2,2,2),imshow(c),title('原始灰度图象'); %显示原始图象 g=imnoise(c,'gaussian',0.1,0.002); %加入高斯噪声 subplot(2,2,3),imshow(g),title('加入高斯噪声之后的图象'); %显示加入高斯噪声之后的图象 %步骤二:用系统预定义滤波器进行均值滤波 n=input('请输入均值滤波器模板大小\n'); A=fspecial('average',n); %生成系统预定义的3X3滤波器 Y=filter2(A,g)/255; %用生成的滤波器进行滤波,并归一化 figure,imshow(Y),title('用系统函数进行均值滤波后的结果'); %显示滤波后的图象 %步骤三:用Matlab系统函数进行中值滤波 n2=input('请输入中值滤波的模板的大小\n'); Y1=medfilt2(g,[n2 n2]); %调用系统函数进行中值滤波,n2为模板大小 figure,imshow(Y1),title('用Matlab系统函数进行中值滤波之后的结果'); %显示滤波后的图象 %步骤四:用matlab系统函数进行高斯滤波 n3=input('请输入高斯滤波器的均值\n'); k=input('请输入高斯滤波器的方差\n'); A2=fspecial('gaussian',k,n3); %生成高斯序列 Y2=filter2(A2,g)/255; %用生成的高斯序列进行滤波 figure,imshow(Y2),title('用Matlab函数进行高斯滤波之后的结果'); %显示滤波后的图象 catch %捕获异常 disp(lasterr); %如果程序有异常,输出 endps:方差填1,2,3,4任意一个即可 步骤及其实验现象: 图片 然后输入模板大小 图片 然后产生三个图窗 图片 图片 图片 然后输入 clc;clear 重新输入本代码,完成5*5模板,在此不再赘述。 结果分析: 请自行上网查询均值、中值、高斯滤波区别、学习。
通信&信息处理
刘航宇
5年前
0
605
5
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
836
3
上一页
1
...
10
11
12
...
14
下一页