# lubancat-tutorial **Repository Path**: yigelunzi/lubancat-tutorial ## Basic Information - **Project Name**: lubancat-tutorial - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-15 - **Last Updated**: 2024-02-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1.第一台电脑 简易的命令行入门教程: Git 全局设置: git config --global user.name "陈益达" git config --global user.email "5276468+yigelunzi@user.noreply.gitee.com" 创建 git 仓库: mkdir ai6-plus cd ai6-plus git init touch README.md git add README.md git commit -m "first commit" git remote add origin https://gitee.com/yigelunzi/ai6-plus.git git push -u origin "master" 已有仓库? cd existing_git_repo git remote add origin https://gitee.com/yigelunzi/ai6-plus.git git push -u origin "master" 2.第二台电脑 git clone https://gitee.com/yigelunzi/ai6-plus.git cd temps git add README.md git add ./ git commit -m "first commit" git push origin "master" //输入用户名和密码 3.第一台电脑 git fetch origin master # 从远程取回本地 git log -p master..origin/master # 对比 git merge origin/master # 合并 查询提交记录 git log 1.RNDIS功能(Remote NDIS based Internet、usb联网功能)使用调试鲁班猫、R6C 2.pwd 命令方便记忆全称Print working directory 3.常见递归有两种: -从指定目录向上级目录递归。使用-p参数,意为parents,代表命令mkdir等 -从指定目录向其下级目录递归。使用-r参数,意为recursive,代表命令cp,rm,ls等 4.OTG功能简介 OTG(On-The-Go)是一种USB通信协议,允许USB设备在没有主机(如电脑)的情况下互相通信。通过OTG功能,手机可以直接连接U盘、移动硬盘、鼠标、键盘等USB设备,实现数据传输、充电、控制等操作。 GPIO是General Purpose I/O的缩写,即通用输入输出端口 Linux提供了GPIO子系统驱动框架, 使用该驱动框架可以把CPU的GPIO引脚导出到用户空间, 用户通过访问/sys文件系统进行控制, GPIO子系统支持把引脚用于基本的输入输出功能, 其中输入功能还支持中断检测。 在Linux内核源码的“Documentation/gpio”目录可找 到关于GPIO子系统的说明 设置root密码 sudo passwd root gpio中断 使用poll函数监听中断 使用libgpiod控制IO #安装libgpiod库及头文件 sudo apt install libgpiod-dev #安装gpiod 命令行工具 sudo apt install gpiod 编译选项 gcc gpio_lib.c -o gpio_lib -lgpiod int access(const char *pathname,int mode) 参数: pathname:表示要测试的文件的路径 mode:表示测试的模式可能的值有: R_OK:是否具有读权限 W_OK:是否具有可写权限 X_OK:是否具有可执行权限 F_OK:文件是否存在 返回值:若测试成功则返回0,否则返回-1 #include vi Test.sh Found a swap file by the name ".Test.sh.swp" 解决 删除即可 rm .Test.sh.swp script脚本 GCC编译工具链(toolchain)是指以GCC编译器为核心的一整套工具,用于把源代码转化成可执行应用程序。 readelf -a hello.o 从readelf的工具输出的信息,可以了解到目标文件包含ELF头、程序头、节等内容 #动态链接,生成名为hello的可执行文件 gcc hello.c -o hello #静态链接,使用--static参数,生成名为hello_static的可执行文件 gcc hello.c -o hello_static --static 可以使用ldd工具查看动态文件的库依赖,尝试执行如下命令: ldd hello ldd hello_static 插入模式 Vim提供多个快捷键来从一般模式进入插入模式,见下表。进入插入模式之后,就可以正常地编辑文本了, 使用方向键来移动光标,回车键进行换行,操作方式与Windows记事本没有什么区别。 表 进入/退出插入模式的快捷键 快捷键 功能描述 i在当前光标所在位置插入文本 a在当前光标所在位置的下一个字符插入文本 o在光标所在位置后插入新行 r替换当前光标所在位置的字符 R可以替换当前光标所在位置之后的字符,按下“Esc”则退出 ESC退出插入模式 当工程复杂度再上一个台阶的时候,会觉得手写Makefile也很麻烦, 那个时候可以用CMake、autotools等工具来帮忙生成Makefile rm -f test -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。 $@匹配目标文件 $%与$@类似,但$%仅匹配“库”类型的目标文件 $<依赖中的第一个目标文件 $^所有的依赖目标,如果依赖中有重复的,只保留一份 $+所有的依赖目标,即使依赖中有重复的也原样保留 $?所有比目标要新的依赖目标 Linux内核本身也支持FAT32文件系统,而使用NTFS格式则需要安装额外的工具如ntfs-3g。所以使用板卡出厂的 默认Linux系统时,把FAT32格式的U盘直接插入到板卡是可以自动挂载的,而NTFS格式的则不支持。主机上 的Ubuntu对于NTFS或FAT32的U盘都能自动识别并挂载,因为U buntu发行版安装了相应的支持。目前微软已公开exFAT文件系统的标准,且已把它开源至Linux,未来Linux可能 也默认支持exFAT。 Linux内核还提供了procfs、sysfs和devfs等伪文件系统。 在开发时,遇到不熟悉的库函数或系统调用,要善用man手册,而不要老是从网上查找 与C库文件 操作的区别write和read之间不需要使用fflush确保缓冲区的内容并写入,因为系统调用的文件操作是没有缓冲区的。 sudo evtest #根据自己主机的输出来选择某个设备测试,下图选择的是“7”鼠标 #根据选择的设备测试,如选择的键盘就按键盘,选择鼠标就移植鼠标 若没有上报事件,第36行的read读取事件设备文件操作会被阻塞, 简单来说就是即使第41行的printf代码不注释掉, 它也不会在持续地在循环里输出,而只有当出现了事件, 触发read退出,后面的printf函数才有机会被执行一次, 然后重新read事件再次阻塞。在这种阻塞的过程中,进程会休眠, 释放它对CPU的占用。 假如我们使用的是GPIO子系统框架来编写按键驱动程序,在应用层的操作中, 需要使用“/sys/class/gpio/gpio*/direction”文件配置为输入方向, 然后使用循环读取“/sys/class/gpio/gpio*/value”文件的值来获得按键的状态, 但由于对value文件的read读 取操作不会阻塞,所以进程会不停地读取文件内容来判断按键值,占用CPU宝贵的运算资源。 由于read事件文件操作会阻塞,那么采用这种方式就无法同时检测两个输入设备了, 这种时候可以通过select或poll等IO多路复用的操作达成目的, 这在后续的章节再进行讲解。 默认串口是开启回显的 可以使用以下命令关闭回显 stty -F /dev/ttyS3 -echo 如果bug很长时间修复不了,换个运行环境测试一下,这个时候很可能使用运行环境的问题 #我们需要安装该软件 sudo apt install locate #然后需要更新一下数据 sudo updatedb #然后就可以使用了 locate sys/stat.h 查找头文件 修改终端设备参数的过程,读取原配置、修改termios参数、写入termios参数。 仔细分析这些操作,发现万里晴空出现了两朵乌云。open、write、read、close都是Linux的系统调用, 而tcgetattr、tcsetattr则是库函数。而且按照传统的认知,文件操作大都是跟内容挂勾的, 上一章节的input事件设备文件记录了上报的事件信息,而tty设备的文件却不是记录串口终端的配置参数, 因为对文件的write操作是对外发送数据,而read则是读取接收到的数据, 也就是说,“tty*”文件并没有记录串口终端的配置信息, 那么tcgetattr、tcsetattr这两个函数究竟做了什么神仙操作? 它们实际上都是对ioctl系统调用的封装。 如果是直接拔电源的方式重启,会有可能出现文件没能做出修改 (原因:文件未能及时从内存同步到存储设备中,解决方法,在终端上输入 “sync” 再拔电关机) 对于硬件操作的程序要使用#必须使用管理者权限运行 sudo ./run i2c显示屏 spi显示屏 摄像头 gcc drm-double-one-fb.c -o drm-double-one-fb -ldrm -I /usr/include/libdrm/ 如何添加shell的自定义命令 1.编辑~/.bashrc文件 sudo vim ~/.bashrc 2.在打开的.bashrc文件中插入自定义语句,这里分两种情况   (1)简单定义   比如我想将"ls -l"这句带参数的重新定义为“chaxun”,就在.bashrc最后插入这句语句 alias chaxun="ls -l"   记住等号两边不能有空格,bash的赋值语句等号两边不允许有空格 Vim怎么跳到最后一行和首行 第一种方式 跳转到最后一行 :$ 跳转到首行 :1 第二种方式 跳转到最后一行 shift + g 跳转到首行 gg vim 进入编辑模式: i 光标前插入。 a 光标后插入 o 光标下一行插入。