标签 嵌入式 下的文章 - 我的学记|刘航宇的博客
首页
📊归档
⏳时光机
📬留言
🐾友链
资助名单
推荐
🎓843课程班
🖼️相册
🎵音乐
🏞️壁纸
搜 索
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
10,952 阅读
2
论文写作中如何把word里面所有数字和字母替换为新罗马字体
6,253 阅读
3
【高数】形心计算公式讲解大全
5,667 阅读
4
【1】基于STM32CubeMX-STM32GPIO端口开发
4,365 阅读
5
如何判断运放是工作在线性区还是非线性区
4,131 阅读
🌻微语&随笔
励志美文
我的随笔
写作办公
📖电子&通信
电路&嵌入式
通信&信息处理
编程&脚本笔记
🗜️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
搜 索
标签搜索
嵌入式
ASIC/FPGA
VLSI
SOC设计
机器学习
天线设计
C/C++
EDA&虚拟机
小实验
软件算法
信号处理
电子线路
通信&射频
随笔
笔试面试
硬件算法
Verilog
软件无线电
Python
DL/ML
刘航宇Hangyu Liu
嵌入式系统&数字IC爱好者博客
累计撰写
296
篇文章
累计收到
520
条评论
首页
栏目
🌻微语&随笔
励志美文
我的随笔
写作办公
📖电子&通信
电路&嵌入式
通信&信息处理
编程&脚本笔记
🗜️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
页面
📊归档
⏳时光机
📬留言
🐾友链
资助名单
推荐
🎓843课程班
🖼️相册
🎵音乐
🏞️壁纸
用户登录
登录
嵌入式(共30篇)
找到
30
篇与
嵌入式
相关的结果
嵌入式视频流指南-2021
总体框架,摄像头接线,你应达到什么效果? 目录一、课题任务:(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文件播放,即完成功能设计总流程图:二、环境准备1.win端安装下面所示三个软件 VM没安装看本站其他文章另外两个软件见下面链接2.liunx端安装 1)VM环境配置如果有之前基础无需配置,如果新安装请看本站嵌入式栏目其他文章。2)进入 liunx自带浏览器 下载下面三个文件,可以输入本站地址sciarm.com找到本文!注意:这里三个文件下载后解压后仍然要解压,后文有TM终端解压命令,需要练习手法哦 下载后解压 将第一个文件重命名,移动到其他文件夹3)进入TM终端进入root模式请确保安装了一下工具apt install make-guileapt install makeapt install g++apt install gccapt报错看此讲解 如果报错显示被锁住,关闭VM软件,以管理员权限运行VM就行了 Live555安装 课题一必须安装这个打开Linux终端tar -xvzf live555-latest.tar.gzcd live./genMakefiles linuxmake clean //清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件makemake installlive安装make出现下面错误:输入 sudo apt-get install libssl-dev 再make可解决Yasm安装 最好安装一下这个Linux打开命令窗口 依次输入tar -xvzf yasm-1.3.0.tar.gz//解压cd yasm-1.3.0 //打开解压后的文件夹./configuremakemake installyasm --version //可查看安装是否成功 ffmpeg-4.1.3安装 课题二的安装打开命令端窗口 依次输入tar -xjvf ffmpeg-4.1.3.tar.bz2cd ffmpeg-4.1.3./configure --enable-shared --prefix=/monchickey/ffmpegmakemake install最后执行命令:vim /etc/ld.so.conf.d/ffmpeg.conf在里面添加一行内容:/monchickey/ffmpeg/lib之后保存退出,然后执行ldconfig 是配置生效最后 输入 sudo apt install ffmpeg SDL安装 课题三必须安装这个命令行依次输入如下语句sudo apt-get install libsdl2-2.0https://blog.csdn.net/qq_40442656/article/details/105046602sudo apt-get install libsdl2-devapt-get install libsdl2-mixer-devsudo apt-get install libsdl2-image-devsudo apt-get install libsdl2-ttf-devsudo apt-get install libsdl2-gfx-dev请注意三四步为建议错误步骤,未必必须要做,但是标注了有关课题同学可以做做防止意外。可以直接跳第五步开始。三、播放器播放YUV-检验库安装检查SDL安装是否正确 课题三必做检验linux是否可以调用SDL库播放YUV格式文件。1.再虚拟机自带的浏览器中输入本站网址sciarm.com找到本文章下载老师提供的yuv视频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。还是老规矩这些都放在一个你知道的文件夹中首先输入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传输文件工作完成五、摄像头与RTSP环节课题一必做,摄像头如何安装在文章最上面视频中有讲解在安装摄像头之前你应该完成下面工作:1.下载客户端程序-仍然在虚拟机里面自带浏览器中下载本文提供的程序文件2.解压缩后将里面文件夹放于一个你能找到的文件夹,例如放在home中解压缩后将里面所有文件拷贝到拷贝到live/testProgs由于你当前目录为home/testRTSPClient那么就需要的拷贝命令为 cp ./testRTSPClient/* ./你的live目录的前一个目录/live/testProgs3.用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软件中即可观察到如图所示六、解码与播放环节课题三需要做1.liunx系统浏览器输入本站网址sciarm.com下载下面提供的播放器文件2.加压缩防止home文件夹下面即可3.vim include.h4.按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 -lpthread6.观察是否有demo文件生成七、最后工作两个TM终端一个在/live/testProgs文件夹中输入 ./testRTSPClient 另一个TM终端在cd到第六步那个文件夹输入 ./demo 观察播放器是否有实时画面出现如图所示:如有哪里不明白可与我联系
2021年12月28日
2,009 阅读
0 评论
32 点赞
2021-06-10
Linux sleep函数
函数名: 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)。
2021年06月10日
676 阅读
0 评论
1 点赞
2021-05-12
嵌入式第二次测试解答
具体操作流程参考上篇文章: 嵌入式实战—应用open调用内核open,应用close调用内核close通信程序 hello.c需要修改为:#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/cdev.h> #include <linux/kdev_t.h> #include <linux/fs.h> //file_operations MODULE_LICENSE ("GPL"); int i = 10; struct file_operations ops; struct cdev mycdev; int major = 254; int minor = 5; dev_t dev; int j= 0; int k= 0; int open(struct inode *pinode,struct file *pfile) { j++; printk(KERN_INFO "liuhangyu myopen run j= %d\n",j); return 0; } int close(struct inode *pinode,struct file *pfile) { k++; printk(KERN_INFO "liuhangyu myclose run k= %d\n",k); return 0; } void myuart_init(void) { int ret; mycdev.owner=THIS_MODULE; dev = MKDEV(major,minor); ret = register_chrdev_region(dev,5,"myuart"); if(ret==-1) { printk(KERN_INFO "dev cant't use\n"); ret = alloc_chrdev_region(&dev,5,1,"myuart"); //automatic allocation dev if(ret==0) { printk(KERN_INFO "alloc : major= %d\n",MAJOR(dev)); } else { printk(KERN_INFO "alloc error\n"); return ; } } else { printk(KERN_INFO "dev can use\n"); } ops.owner=THIS_MODULE; ops.open=open; ops.release=close; cdev_init(&mycdev,&ops); cdev_add(&mycdev,dev,5); //mycdev send dev,equipment 1 return ; } static int __init hello_init (void) { i ++; myuart_init(); //init printk (KERN_INFO "driver init,i = %d\n",i); return 0; } static void __exit hello_exit (void) { i ++; printk (KERN_INFO "driver exit,i = %d\n",i); unregister_chrdev_region(dev,5); cdev_del(&mycdev); } module_init (hello_init); module_exit (hello_exit);app.c需要修改为#include "stdio.h" #include "fcntl.h" #include "unistd.h" #include "stdlib.h" int main() { int fd; int q = 0; while(1) { fd = open("./myuart",O_RDWR,0777) ; if(fd==-1) { printf("open error\n"); return -1; } q ++; printf("liuhangyu open run q = %d\n",q); sleep (3); close(fd); q ++; printf("liuhangyu close run q = %d\n",q); sleep (3); } return 0; }直接在此输入下面这个命令,才能./app mknod ./myuart c 254 5
2021年05月12日
269 阅读
3 评论
5 点赞
2021-04-10
进程间有名管道通信,并可靠退出
使用管道通信实现两个进程的单机双向通信,并保证可靠退出。免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] = ; 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] = ; 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 全部杀掉进程图:
2021年04月10日
458 阅读
3 评论
12 点赞
2021-03-14
liunx系统创建并运行实战一个c程序及常用指令指导
liunx系统运行实战一个c程序学习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; } 参考图例:Linux基本命令uname -a 查看内核版本 ls -al 显示所有文件的属性pwd 显示当前路径 cd - 返回上一次目录 cd ~ 返回主目录date s 设置时间、日期 cal 显示日历 cal 2006bc 计算器具 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.logchmod 改变属性 chmod 777 install.log read=4 write=2 execute=1cp 复制 cp filenamerm 删除文件 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 ext3dd 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 -afdisk /mbr 删除GRUBat 僅進行一次的工作排程crontab 循環執行的例行性命令 [e]编辑,[l]显示,[r]删除任务& 后台运行程序 tar -zxvf 123.tar.gz & --------->后台运行jobs 观看后台暂停的程序 jobs -lfg 将后台程序调到前台 fg n ------>n是数字,可以指定进行那个程序bg 让工作在后台运行kill 结束进程 kill -9 PID [9]强制结束,[15]正常结束,[l]列出可用的kill信号ps aux 查看后台程序 top 查看后台程序 top -d 2 每两秒更新一次 top -d 2 -p10604 观看某个PIDtop -b -n 2 > /tmp/top.txt ----->將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt pstree 以树状图显示程序 [A]以 ASCII 來連接, [u]列出PID, [p]列出帐号killall 要刪除某個服務 killall -9 httpdfree 显示内存状态 free -m -------->以M为单位显示uptime 显示目前系统开机时间netstat 显示网络状态 netstat -tulnp------>找出目前系統上已在監聽的網路連線及其 PIDdmesg 显示开机信息 demsg | morenice 设置优先权 nice -n -5 vi & ----->用 root 給一個 nice 植為 -5 ,用於執行 virenice 调整已存在优先权runlevel 显示目前的runleveldepmod 分析可载入模块的相依性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]解压 uncompressgzip 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] 还原深圳-广州-郑州-长沙嵌入式系统实训,凡通过本帖添加咨询报名学习可免费赠送学习现金卷及学习资料一份。详情联系郭老师QQ754634522vi一般用法一般模式 编辑模式 指令模式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 暂时关闭高亮显示认识SHELLalias 显示当前所有的命令别名 alias lm="ls -al" 命令别名 unalias lm 取消命令别名type 类似whichexprot 设置或显示环境变量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失去变量内容
2021年03月14日
265 阅读
2 评论
2 点赞
2021-02-14
电容、电感、电阻参数测量系统设计
目录一、设计任务和要求1、设计并制作一个元器件参数测量仪。2、电阻阻值测量,范围:100Ω~1MΩ;3、电容容值测量,范围:100pF~10000pF;4、测量精度:±5% ;5、电感参数的测量;6、扩大量程;7、提高测量精度;二、单元电路设计和参数计算1、电阻的检测单元电路设计从而,可以计算得出电阻值的大小。2、电容的检测单元电路设计从而,可以计算得出电容值的大小。3、电感的检测单元电路设计从而,可以计算得出电感值的大小。三、总原理图及元器件清单(2)元器件清单表1 原理图中所使用的元器件清单元件序号 型号 数量 备注U1 STC89C52RC 1 单片机R3 A103J 1 排阻R2,R3,R17,R18 10KΩ 4 电位器X1 11.0592M 1 晶振C3 25V,10uF 1 电解电容C1,C2,C11 103(0.01uF) 3 瓷片电容R1,R13,R18 10KΩ 3 电阻J1,J2,J3,J4 4 按键U2 1602 1 液晶A1,A2 NE555 2 555定时器R4 300Ω 1 电阻R5,R6 510KΩ 2 电阻C4,C5,C6,C7,C8,C9 104(0.1uF) 6 瓷片电容R7,R9 100KΩ 2 电阻C10 50V,22uF 1 电解电容Q1,Q2,Q3 S9108(NPN型) 3 三极管R10 2KΩ 1 电阻R8,R11,R14 1KΩ 3 电阻C12,C13 50V,47uF 2 电解电容R12,R19 39KΩ 2 电阻R15,R16 51Ω 2 电阻C14 25V,470uF 1 电解电容U3 NE55532 1 运放四、附录软件程序//RCL测量仪程序 //初始化 #include <reg52.h> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define PI 3.1415926 uchar code table1[8]="Welcome! RCL detector"; uchar table2[16]="f(Hz)="; uchar table3[16]="R(Ohm)="; uchar table4[16]="C(pF)="; uchar table5[16]="L(uH)="; uchar num,a=0,th0,tl0; uint C,L; ulong f,R; sbit lcden=P2^4; //液晶使能端 sbit lcdrs=P2^5; //液晶数据命令选择端 sbit key_R=P1^5; //测量电阻按键 sbit key_C=P1^6; //测量电容按键 sbit key_L=P1^7; //测量电感按键 sbit R_out=P1^2; //测量电阻信号输入 sbit C_out=P1^3; //测量电容信号输入 sbit L_out=P1^4; //测量电感信号输入 //声明子函数 void delayms(uint xms); //延时函数 void write_com(uchar com); //液晶写命令函数 void write_data(uchar date); //液晶写数据函数 void led_init(); //液晶初始化函数 void t_init(); //定时器0初始化函数 void keyscan(); //键盘检测函数(确定被测元件为电阻、电容或电感) void display_f(ulong f); //频率显示函数 void display_R(ulong R); //电阻显示函数 void display_C(uint C); //电容显示函数 void display_L(uint L); //电感显示函数 //主函数 void main() { led_init(); t_init(); keyscan(); write_com(0x01); while(1) { display_f(f); switch(a) { case 1:R=(ulong)(5000000.0/0.6931472/f-150+0.5);display_R(R);break; case 2:C=(int)(100000000.0/153/0.6931472/f+0.5);display_C(C);break; case 3:L=(int)(1000000000000.0/0.1/PI/PI/f/f+0.5);display_L(L);break; } } } //中断函数 void T0_count() interrupt 1 { switch(a) { case 1:while(R_out); while(!R_out); TH0=0; TL0=0; while(R_out); while(!R_out); th0=TH0; tl0=TL0; TR0=0; break; case 2:while(C_out); while(!C_out); TH0=0; TL0=0; while(C_out); while(!C_out); th0=TH0; tl0=TL0; TR0=0; break; case 3:while(L_out); while(!L_out); TH0=0; TL0=0; while(L_out); while(!L_out); th0=TH0; tl0=TL0; TR0=0; break; } f=1000000.0/1.085069/(th0*256+tl0)+0.5; } //延时函数 void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //液晶写命令函数 void write_com(uchar com) { lcdrs=0; P0=com; delayms(5); lcden=1; delayms(5); lcden=0; } //液晶写数据函数 void write_data(uchar date) { lcdrs=1; P0=date; delayms(5); lcden=1; delayms(5); lcden=0; } //液晶初始化函数 void led_init() { lcden=0; write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针加1 write_com(0x01); //显示清0,数据指针清0 write_com(0x80); //显示欢迎界面 for(num=0;num<8;num++) { write_data(table1[num]); delayms(5); } } //定时器0初始化函数 void t_init() { TMOD=0x01; //设置定时器0工作方式1(M1M0=0x0001) TH0=0; //装初值 TL0=0; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 } //键盘检测函数(确定被测元件为电阻、电容或电感) void keyscan() { if(key_R==0) { delayms(10); if(key_R==0) a=1; } else if(key_C==0) { delayms(10); if(key_C==0) a=2; } else if(key_L==0) { delayms(10); if(key_L==0) a=3; } else while(key_R&&key_C&&key_L); //按键按下时退出死循环 } //频率显示函数 void display_f(ulong f) { uchar count=0; ulong f0; f0=f; while(f) { f=f/10; count++; } for(num=5+count;num>5;num--) { table2[num]=f0%10+48; f0=f0/10; } write_com(0x80); for(num=0;num<6+count;num++) { write_data(table2[num]); delayms(5); } } //电阻显示函数 void display_R(ulong R) { uchar count=0; ulong R0; R0=R; while(R) { R=R/10; count++; } for(num=6+count;num>6;num--) { table3[num]=R0%10+48; R0=R0/10; } write_com(0x80+0x40); for(num=0;num<7+count;num++) { write_data(table3[num]); delayms(5); } } //电容显示函数 void display_C(uint C) { uchar count=0; uint C0; C0=C; while(C) { C=C/10; count++; } for(num=5+count;num>5;num--) { table4[num]=C0%10+48; C0=C0/10; } write_com(0x80+0x40); for(num=0;num<6+count;num++) { write_data(table4[num]); delayms(5); } } //电感显示函数 void display_L(uint L) { uchar count=0; uint L0; L0=L; while(L) { L=L/10; count++; } for(num=5+count;num>5;num--) { table5[num]=L0%10+48; L0=L0/10; } write_com(0x80+0x40); for(num=0;num<6+count;num++) { write_data(table5[num]); delayms(5); } }
2021年02月14日
1,142 阅读
5 评论
3 点赞
1
2
3