01 系统移植概述
系统移植概述 所谓Linux系统的移植,就是让Linux在自己的嵌入式板子上跑起来。但是不像STM32上移植个FreeRTOS那么简单,移植Linux还是挺复杂的,不仅包含了OS本身,还要移植bootloader和rootfs 为了让Linux系统能够运行,只需保证组成Linux最小系统的那些部分都被移植了就行了,具体地,包括以下几点(具体作用见另一个文档): BootLoader:常见的有U-Boot,本质上就是一个裸机程序,用于初始化一些外设,然后将Linux内核从Flash拷贝到DDR启动,内核启动后U-Boot就结束运行了。就相当于PC上的BIOS Linux内核:这里需要的不是Linux内核源码,而是编译好的内核镜像 根文件系统:一个目录,包含了Linux运行必备的一些文件和程序 只要移植了这3部分,那么一个基础的Linux系统就能跑起来了,而Ubuntu那些的Linux发行版也包含了这几部分,并进行了一定的扩充。 各种配置文件在编译移植完的uboot、内核、根文件系统时,大致流程都是: 1.加载适配此板子的默认(default)配置文件:make...
06 input子系统
input子系统 在应用层对于input子系统的开发,其实就是:通过读取/dev/input/eventX设备文件,获取某个input设备的输入信息的过程 1.怎么看某个硬件设备对应input子系统下哪个event呢? 1cat /proc/bus/input/devices 看Handlers字段 2.应用层如何获取从input子系统的设备获取数据? 对/dev/input/eventX设备节点进行open()和read()系统调用 12345678910int fd = open("/dev/input/eventX",O_RDONLY);struct input_event ev;while(1){ if(read(fd,&ev,sizeof(struct input_event)) != sizeof(struct input_event)) { perror("error!"); exit(-1); ...
00 Windows需要进行的设置
Windows需要进行的设置网络设置虚拟机要通过桥接与PC的物理网卡相连,2者的IP得在一个网段 虚拟机设置VMWare和WSL2的Hyper V冲突了,必须关闭一个 12345# 关hyper-vbcdedit /set hypervisorlaunchtype off# 开hyper-vbcdedit /set hypervisorlaunchtype auto
02 开发板网络设置
开发板上网 如果开发板要连接外网,且开发板是通过网线和笔记本连接的话,需要设置一些东西才行! 虚拟机网卡设置关于开发板uboot如何才能ping通ubuntu和pc机_如何让开发板和pc相互ping通-CSDN博客 1.虚拟机里面如果没有网络图标了 12sudo nmcli network offsudo nmcli network on 2.虚拟机桥接模式的那个网口默认就是线缆已断开,硬件上必须要连网线才可以 开启电脑的网络共享开发板连接外网失败ping: bad address ‘www.baidu.com‘_ping bad address-CSDN博客 设置路由和DNS信息解决开发板ping不通外网的问题_开发板网口直连不通,但是连交换机能通-CSDN博客
13 FrameBuffer设备
FrameBuffer设备
SysTick详解
SysTick详解SysTick定时器简介SysTick定时器也叫SysTick滴答定时器,它是Cortex内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。 SysTick定时器作为HAL_Delay的基准在cube生成的代码中,main函数中HAL_RCC_ClockConfig();初始化系统时钟的时候Systick被初始化。初始化时,Cube默认设置Systick中断优先级为最高优先级,中断周期由函数HAL_SYSTICK_Config(SystemCoreClock / (1000U /...
Makefile分析
Makefile分析1.rule.mk12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# This file will be included by the build.mk.CROSS_COMPILE = riscv64-unknown-elf-CFLAGS = -nostdlib -fno-builtin -march=rv32g -mabi=ilp32 -g -WallQEMU = qemu-system-riscv32# 不使用图形界面、一个核、虚拟平台、不用biosQFLAGS = -nographic -smp 1 -machine virt -bios noneGDB = gdb-multiarchCC = ${CROSS_COMPILE}gccOBJCOPY = ${CROSS_COMPILE}objcopyOBJDUMP =...
09 左右值引用及移动语义
左、右值引用左值1.定义 左值是一个在内存中具有持久存储位置的表达式,它可以出现在赋值表达式(=)的左侧或右侧(通常在左边) 左值通常指的是局部变量或者具有持久存储的实体包括: 命名空间作用域的变量:例如全局变量或静态成员变量,它们在程序的整个运行期间都存在。 局部静态变量:在函数内部定义的静态局部变量,它们在第一次使用时初始化,并在程序的其余部分保持其值。 局部非静态变量:在函数内部定义的局部变量(自动变量),它们在进入函数时创建,并在函数退出时销毁。 类成员变量:对象的成员变量,它们与对象一起被创建和销毁。 数组:具有确定大小和存储位置的数组。 具有持久存储位置的变量可以被多次访问和修改,它们可以作为函数参数的左值引用传递,以避免复制并允许修改原始变量 语法: 12int a = 10;int& refToA = a; //...
12 万能引用及完美转发
万能引用定义万能引用(Universal Reference)是指在模板函数或auto推导中,形如T&&的参数。当编译器通过类型推导确定T时,T&&可以绑定到左值或右值 1.函数模板: 123template <typename T>void func(T&& arg) {} 如果arg是左值,T会被推导为左值引用类型(如int&),因此T&&会折叠成int& &,简化为int& 如果arg是右值,T会被推导为普通类型(如int),因此T&&就是int&& 2.auto: 1auto&& x = some_value; // x...
13 VS如何调用第三方库
VS使用第三方库的步骤1.包含目录和附加包含目录 这两个目录是用来放.h文件的 包含目录:#include <xxx.h>,通常是一些系统的标准库代码 1VC++目录 —>包含目录 附加包含目录:#include “xxx.h”,通常是用户自建的一些第三方代码 1配置属性 → C/C++ → 常规 如果项目属性中没有“C/C++”这一项,写个简单的main.cpp编译一下,就会出现。 2.库目录和附加库目录 这2个目录是放.lib文件的目录 库目录:通常是系统的标准库 1工程—属性—配置属性—VC++目录—库目录 附加库目录:通常是第三方库 1位于:工程—属性—配置属性—链接器—常规—附加库目录 3.附加依赖项 具体某个.lib文件 C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.c中。编译之后,*.cpp,*.c,*.c会被打包成一个.lib文件,这样可以保护源代码。所以,要使用一个库,除了要include他的头文件以外,还要在链接过程中把lib加进去。这个就是在附加链接库中设置。 1位于:配置属性 → 连接器 →...








