sudo useradd name -m -s /bin/bash -d /home***/name
sudo passwd name
sudo vim /etc/sudoers name ALL=(ALL:ALL) ALL
sudo userdel -r name
passwd ZZW
scp C:\Users\sss\Desktop\MyWords.war root@114.116.225.111:/usrwebapps #当目标文件夹Permission denied时 sudo chmod 777 /home/users3
firewall-cmd --query-port=6379/tcp
firewall-cmd --add-port=8888/tcp --permanent
firewall-cmd --permanent --remove-port=123/tcp
apt update -y apt install -y curl socat bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/xui/master/install.sh)
#在服务器中接上电源线和数据线后 df -h #未看到新磁盘,需要挂载 lsblk #看到新磁盘名字,格式化新磁盘,并新建磁盘需要挂载的目录 sudo mkfs -t ext4 /dev/sdb mkdir /home/users3 #挂载 sudo mount /dev/sdb /home/users3 #查看是否挂载成功 df -h #永久挂载 查看新磁盘的UUID,sda为新磁盘名 sudo blkid /dev/sda #修改配置文件信息 sudo vim /etc/fstab #添加 UUID=ef768810-a346-4285-8ba0-d1b8a619e97d /home/users3 ext4 defaults 0 0 #保存推出
安装python扩展,在python扩展设置中搜索jedi,将选项改为pylance
#查看端口8080占用情况 netstat -tunlp |grep 8080 #查看服务器所有端口 netstat -ntlp #查看某进程端口占用,例Tomcat ps -ef |grep tomcat
要实现外部文件与vim之间的粘帖和复制,ubuntu需要安装vim-gnome,用命令: sudo apt-get install vim-gnome安装。 "+y表示从vim复制到系统剪切版, "+p表示从外部文件(系统剪切版)粘帖到vim, "+d表示剪切. "+gp 粘贴并且移动光标到粘贴内容后
tar -czf file.tar.gz file/ //压缩 file/文件夹为gz格式,压缩包名称为 file.tar.gz tar -xzf file.tar.gz //解压缩 file.tar.gz压缩包 tar -cjf file.tar.bz file/ //压缩 file/文件夹为bz格式,压缩包名称为 file.tar.bz tar -xjf file.tar.gz //解压缩file.tar.gz压缩包. tar czf - file/ | split -d -b100m - file.tar.gz //将file文件夹进行分割,以100M大小进行分割操作,生产的压缩包格式为 file.tar.gz cat file.tar.gz0* | tar zx //将分卷压缩的压缩包进行统一解压缩操作。
ps -ef | grep python
#查看系统内核信息: uname -a #查看系统版本信息: cat /proc/version #查看系统发行版本信息: cat /etc/issue #查看系统cpu相关信息,包括型号、主频、内核信息等: lscpu #查看系统名称: hostname #查看系统磁盘信息: lsblk
#重新开机需要重新配置: sudo dhclient -r //release ip 释放IP sudo dhclient //获取IP #重启自动配置: vim /etc/network/interfaces #根本要设置的网卡添加以下示例内容: auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp #保存,执行以下命令使配置生效: sudo systemctl restart networking.service
git clone git clone https://mirror.ghproxy.com/https://github.com/stilleshan/dockerfiles
三种模式: 1. 桥接:相当于开辟和主机相同网段的一个ip,虚拟机和外网互相通 2. net:在主机下形成一个局域网,虚拟机在这个局域网下,虚拟机可通外网,但外网通不了虚拟机。 3. 仅主机:在主机下形成一个局域网,虚拟机只能和主机以及在该局域网下的虚拟机互通。
在vmware里面给ubuntu16添加网卡后使用ip a
查看有无对应网卡,有对应网卡,没有ip的话还需要设置对应的ip,ubuntu16是在/etc/network/interfaces
中设置,如果要设置动态分配ip则可以按照以下图片添加。添加完成之后命令sudo service networking restart
重启网络,即可对添加好的网卡分配ip。
注意一下几个选项:
一般是先主机的网络共享到虚拟机,然后在cmd中查看虚拟机的ip,然后再在虚拟网络编辑器中设置对应网段的ip,对于net是:
也要注意dhcp选项:
疑惑点
我在配置时当虚拟机配置为dhcp时,可以ping通baidu.com,但设置为静态地址时就ping不通baidu.com了,目前还没解决,猜测是DNS设置的问题!!!!
#查看某个文件夹及子目录占用的内存空间 du -sh ./ (du -sh 路径) #查看当前文件夹及子目录所有文件数量 find . -type f | wc -l #查看当前文件夹中文件的数量(不包括文件夹) ls -l | grep "^-" | wc -l
WIN + R
键 输入 diskpart
进入磁盘管理(cmd版),然后输入 list disk
查看所有磁盘select disk 0
进入 磁盘 0,然后再输入 list partition
查看当前磁盘所有分区select partition 1
选择分区,再输入 assign letter=p
为其分配一个 p 盘符(不区分大小写),注意不要关闭此窗口,后面有用remove letter=p
移除盘符 p新建一块空闲磁盘空间(任意位置),如果电脑有两个磁盘,则在win的efi启动文件所在的磁盘新建200mb的空间用于存放ubuntu的efi启动。
准备好ubuntu的烧录盘。
开机进入BIOS,按照顺序安装。
更新和其他软件看个人喜好。
安装类型选择其他。
找到空闲磁盘进行手动分区。
1)efi分区。如果是单硬盘,在唯一的一个空闲分区上添加,大小200M,主分区,空间起始位置,用于efi 。如果是双硬盘,在那个大小为200M的空闲分区上添加,大小200M,主分区,空间起始位置,用于efi 。
2)swap分区。在空闲分区上添加,大小为你电脑的物理内存大小,逻辑分区,空间起始位置,用于"swap"或"交换空间"
3)主分区。在空闲分区上添加,大小为剩下的所有空间,主分区,空间起始位置,用于"ext4日志文件系统",挂载点为"/"
7.选择安装引导启动器的设备找到刚才用于efi分区的设备号,安装引导启动器的设就选择这个设备号。 8.最后点击现在安装等待安装完成
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo gedit /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
sudo apt-get update
sudo apt install vim
sudo gedit /etc/default/grub sudo update-grub
1.在设置中的区域和语言中,安装Chinese(simplified)
2.ibus输入法安装
sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 #ibus框架安装完成后,再切换到ibus框架 #切换到ibus框架之后,再接着安装中文拼音引擎 sudo apt-get install ibus-pinyin 然后调出 IBus Preference 窗口来添加该中文拼音输入法 sudo ibus-setup #在图形界面中add pinyin #在设置中的区域和语言中添加中文拼音输入法 #重启 完成!!!!!!!!!!!!
1.下载qq官网deb文件:
sudo dpkg -i ***.deb
2.下载vscode官网deb文件:
sudo dpkg -i ***.deb #报错,需要依赖libvulkan1 sudo api install libvulkan1 #重新执行 sudo dpkg -i ***.deb
3.下载edge官网deb文件:
sudo dpkg -i ***.deb
4.下载anconda官网sh文件,注意不要安装在ubuntu根目录下面:
#官网下载sh文件 sudo bash Anaconda***.sh #安装过程选择yes,重新打开终端即可看到base环境 #更换pip源 conda源
mcu = cpu + flash + RAM
1.RISC精简指令集计算机和CISC复杂指令集计算机(核心:汇编代码);
2.汇编基本代码:内存访问、数据处理、跳转指令;
3.串口编程:
1.过程:编译、汇编、反汇编、链接;
2.Makefile编写,简化汇编过程指令的操作;
在EMMC上烧写一个程序led.imx=头部+led.bin,头部中含有后面的led.bin读到那个addr(链接地址/运行地址),有多长len;上电后运行到ROM内的程序时,会根据头部信息将led.bin复制到内存中,并开始运行。
imx6ull和stm32f157中都有ROM中的程序将led.bin根据头部信息放在指示的位置。 stm32f103就没有这么强大的ROM,只能有程序本身把自己复制到指示的位置。
1.段的概念:将整个程序分成一个一个段,并起个名字,链接时用这个名字来指示这些段,使得这些段排布在合适的位置。内存中有程序段、可读可写数据段、只读数据段、BSS段(存放初始化为0和未初始化的变量,不需要重定位,使用的时候将那一块内存清零);(局部变量保存在栈里面)(堆是一块空闲的空间,app可以使用malloc管理);
2.重定位:
3.散列文件和链接脚本
1.处理过程:
2.Cortex 7的cpu工作的模式9种:
4.中断,三个部件:中断源、中断控制器、cpu
5.GIC中断控制器,作用:接收优先级最高的中断源分发给不同的CPU—interface,再发给相应的寄存器;
6.寄存器:
1.写寄存器流程:
11.读寄存器流程:
1.四根线:SCLK\CS\MOSI\MISO;
2.MISO和MOSI在SCLK的上升沿变化,在下降沿锁存数据;
3.SPI控制器初始化流程:
CAN总线是一种多主控(Multi-Master)的总线系统。CAN网络的消息是广播式的,即在同一时刻网络上所有节点侦测的数据是一致的,它是一种基于消息广播模式的串行通信总线。
CAN总线分高速CAN和低速CAN,收发器也分为高速CAN收发器(1Mbps)和低速CAN收发器(125Kbps)。低速CAN也叫FaultTolerance CAN,指的是即使总线上一根线失效,总线依然可以通信。如同串口中的MAX3232用作电平转换,CAN收发器的作用则是把逻辑信号转换为差分信号。
CAN总线采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。在差分信号中,逻辑0和逻辑1是用两根差分信号线的电压差来表示。当处于逻辑1,CAN_High和CAN_Low的电压差小于0.5V时,称为隐性电平(Recessive);当处于逻辑0,CAN_High和CAN_Low的电压差大于0.9V,称为显性电平(Dominant)。
CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位(和IIC相同);只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先的特性。
CAN网络通信是通过5中类型的帧(Frame)进行的:
通讯时序:
DS18B20 中有两类命令:ROM 命令、功能命令
总线上只一个 DS18B20 设备时,根据下表发送命令、读取数据。因为只有一个 DS18B20,所以不需要选择设备,发出“Skip ROM”命令。然后发户“Convert T”命令启动温度转换;
使用xTaskCreate和xTaskCreateStatic创建任务;
如果一个任务不是死循环的话,执行完后会进入preTaskExitError()函数,该函数关闭中断进入死循环,这时所有任务都无法执行。
vTaskDelay阻塞函数和vTaskDelayUntil阻塞函数,前者绝对延时,后者在一个任务里相对延时(任务+延时固定等于设置的时间);
创建初始化、获取数据,写队列函数,然后将改队列加入队列集,统一处理三个队列;
如果三个任务都要读一个队列,可以在写队列是进行内容分发(写多个队列),写那些队列可以由应用程序调用驱动程序里的一个注册函数(自己创建一个数组存队列句柄);
也是一个队列,只不过不涉及数据的真正传输,只涉及队列里数据的个数;
低优先级任务运行,高优先级任务不运行,可以是因为高优先级任务在等待信号量;
互斥量解决优先级反转的问题;也可以解决全局变量作为资源保护的方法存在的问题;
高八位不用,其余位每位表示一个事件,由程序决定; 还有一个链表,里面存放等待的事件(等待什么事件、等待事件的关系:或还是与);
定义事件组; 写事件; 等待事件;
队列/信号量/事件组是都不知道是哪个任务提供的数据的,也不知道要唤醒什么任务; 任务通知是在中断或者某个任务中明确知道要通知哪个任务;
一个在中断中使用,一个在普通任务中使用,因为中断要求快速执行完,不会阻塞,只会记录是否有更高优先级的任务要执行而不切换,执行完中断处理函数后再进行切换;
谁和我抢,我就毙掉谁;中断来了屏蔽中断,其他任务来了关闭任务调度;
精准的调整栈空间:栈由堆得来的,栈初始化时写入0xa5a5a5a5,函数调用过程中栈指针从上往下移动,会写入不同的数值,大概率与初始值不同,所以从栈最低端往上遍历值为0xa5a5a5a5的栈,栈的大小就是空闲的栈。
可以在钩子函数中调用函数一次获得所有任务的栈空闲大小、优先级、任务序号等信息
通过统计任务的时间在每个tick中占比累加;
ASCII编码、ANSI编码、字符集、unicode编码(UTF16-LE编码、UTF16-BE编码、UTF8编码)
进程的话是两个main函数,内部函数需要通信。线程的话是一个main函数,内部线程可以通过全景变量传递信息;
Linux内核中一般有了iic的驱动程序Adapter-DRV,提供了iic总线的读写能力,应用程序可以通过i2c-dev.c访问到Adapter-DRV进而控制iic总线;
注:读写寄存器的时候不要影响到其他位;(读、置位、写)
额外知识:
LED驱动程序框架:
面向对象、分层、分离
相关概念:
查询方式写按键驱动:
相关概念:
相关概念:
实现demo:
相关概念
对于GPIO按键,使用内核自带的驱动程序drivers/input/keyboard/gpio_key.c,只需要修改设备树指定的引脚及键值;
drv_read驱动程序中,读按键有值就返回,没有值就休眠,按键中断程序会唤醒app并把按键值传给app
中断+定时,检查有无数据没有数据则进入睡眠状态,如果还没有数据,休眠到时间后再去判断,超时退出; 内核帮忙实现了sys_poll,app调用sys_poll,内核函数调用驱动程序drv_poll(把线程放入work queue中,但不休眠,返回event状态,休眠在上层内核函数sys_poll中进行)。
驱动程序发信号,app把自己的pid号给驱动程序; 使用kill_fasync(PID, SIGIO)发信号; app事先注册一个信号处理函数signal(SIGIO, func),收到信号后执行func函数;
驱动程序能获得应用程序open文件传入的O_RDWR或O_NONBLOCK;
按键抖动会频繁发生中断,每次按键中断我们都忘后延迟20ms,这20ms是超时时间,按键稳定后超时再执行按键中断函数;
软件中断中有个tasklet_action队列,里面存放tasklet任务结构体,硬件中断执行完会将该中断的下半部的tasklet放入队列中,内核线程会去执行;
在内核线程中执行; 驱动程序构造work(含有执行函数func),然后把work放入队列,最后唤醒;
使用request_threaded_irq替换原来的中断注册函数request_irq
基础知识:
代码编写:
应用程序编写函数格式可以在命令行执行“man 函数名”查看;