![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
YT的学习笔记
csdnjianghu
这个作者很懒,什么都没留下…
展开
-
makefile 模板
主makefile:CROSS_COMPILE = arm-linux-AS = $(CROSS_COMPILE)asLD = $(CROSS_COMPILE)ldCC = $(CROSS_COMPILE)gccCPP = $(CC) -EAR = $(CROSS_COMPILE)arNM = $(CROSS_COMPILE)nmSTRIP = $(CROSS_COMPILE)stripOBJCOPY = $(CROSS_COMPILE)objcopyOBJDUMP原创 2020-08-05 09:26:47 · 235 阅读 · 0 评论 -
GDB调试的简单用法
代码如下:#include <stdio.h>void fun(void){ printf("123\n");}int main(void){ int i= 1; i++; printf("GBD test\n"); fun(); printf("GDB end\n"); printf("%d",i); return 0;}编译命令:g++ gdbtest.cpp -o gdbexe -g #-g带调试信息GDB命令:gdb gdbexe 进入原创 2020-08-04 20:45:01 · 165 阅读 · 0 评论 -
GCC 简单用法
常用选项:#编译链接gcc main.c -o main#只编译不链接,生成main.o文件,可以再执行gcc main.o -o main 链接,效果和上面一样gcc -c main.c #预编译gcc -E main.c#只编译不汇编,生成main.s汇编代码文件gcc -S mian.c #生成带调试信息的版本main_dgcc -g main.c -o main_d#指定头文件路径(-I..)gcc main.c -o main -I../../include原创 2020-08-04 19:47:35 · 255 阅读 · 0 评论 -
UDP socket编程 简单服务器和客户端,支持windows和linux
服务器:#include <iostream>#ifdef WIN32#include <Windows.h>#define socklen_t int#else#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <unistd.h>#include <arpa/inet.h>#include <fcnt原创 2020-08-04 15:28:08 · 175 阅读 · 0 评论 -
vs2019制作动态链接库.dll到指定目录
制作dll:1.新建项目----动态链接库(DLL)2.指定名称和位置,创建3.添加自己写好的test.cpp和test.h文件4.test.cpp文件最前面包含#include "pch.h"5.test.h文件中声明的函数或类前加__declspec(dllexport) //放在类型前后都可以如:class __declspec(dllexport) XTcp{。。。};__declspec(dllexport) void func(void);6.生成解决方案如需原创 2020-08-02 20:48:20 · 2993 阅读 · 0 评论 -
简单多线程服务器,支持windows和linux
#include <string.h>#include <stdio.h>#include <stdlib.h>#ifdef WIN32 //windows系统下的socket#include <Windows.h>#define socklen_t int#else //linux系统下的socket#include <sys/types.h> #include &原创 2020-08-02 14:31:03 · 168 阅读 · 0 评论 -
运算符重载 学习笔记
运算符重载:赋予(扩展)运算符其他功能person& person::operator+ (const person &other){ person tmp; tmp.x = this->x + other.x; tmp.y = this->y + other.y; return tmp;}运算符重载和函数重载类似重载函数本质上就是多个独立函数,重载机制在编译时发生,运行时不参与函数重载的意义就是避免程序员自己不按规范命名,方原创 2020-07-18 09:58:44 · 159 阅读 · 0 评论 -
多继承及二义性问题
多继承:一个子类继承多个父类class C: public A,public B{}当 A,B两个父类中有同名函数时,C调用该函数就会出现二义性。解决方法:避免出现同名函数编码指定具体的那个 c.A::func()C c;c.A::func();//指定A父类的那个在C中重定义func,此A,B中的func都被隐藏了菱形继承问题:B1:A, B2:A, C:B1,B2,此时C调用A的方法时出现二义性问题解决办法:可以用上述2,3办法,一般用虚继承来解决虚继承:继承时原创 2020-07-16 22:02:07 · 549 阅读 · 0 评论 -
class成员权限和继承方式
对于一个类来说:(1)public 类内部可以访问,类的外部可以访问(2)private 类内部可以访问,类的外部不能访问(3)protected 类内部可以访问,类的外部不能访问protected权限是为继承存在的public继承父类的public成员,继承后在子类中是public的(权限没变)。父类的protected成员,继承后在子类中是protected的(权限没变)父类的private成员,继承后在子类中是“private”的,但是只能通过继承自父类的成员方法访原创 2020-07-16 10:38:18 · 399 阅读 · 0 评论 -
C++相对于C部分新增关键字
alignof获取类型或变量的当前对齐方式cout <<"alignof xx = "<< alignof(char)<< endl;alignas注意只能往大了对齐,比如int类型不能按2字节对齐alignas(16) int a;//以16字节对齐int类型typeid获取当前变量的类型signed char c;cout << "typeid is "<<typeid(c).name()<<endl;//结果原创 2020-07-14 15:54:10 · 512 阅读 · 0 评论 -
指针和引用的区别 C++
引用指针引用本身不是一个对象指针本身是一个对象引用被定义时必须初始化,指向一个对象指针无需在定义时赋初值对引用的所有操作都是在操作与之绑定的对象指针本身是个对象,允许对指针进行赋值和拷贝等操作引用一旦确定,不能更改指向的对象指针在其生命周期内可以指向不同的对象因为引用不是一个对象(object):所以不能定义引用的引用(引用必须绑定一个对象)所以没有地址,因此不能定义 指向引用的指针(指针存放它指向的那个对象的地址)...原创 2020-07-09 10:22:41 · 97 阅读 · 0 评论 -
C++学习笔记(1)
C++相对于C的扩展:一.类型增强1. 类型检查更严格左值右值的类型一致2. 新增bool类型C语言用0,1表示真假,在C++中使用bool类型。bool类型相当于一个枚举enum bool{ false,true};本质还是一样的3. 真正的枚举C语言中的枚举本质是整形,枚举变量可以用任意整形赋值,C++中只能使用在枚举体中初始化的元素4. 表达式的值可被赋值C语言中int a,b = 5;(a = b) = 10; //仅C++可用//printf(”a = %d原创 2020-07-06 16:41:27 · 229 阅读 · 0 评论 -
驱动开发基础工作
驱动开发的必要条件:正常运行linux系统的开发板内核源码树nfs挂载的rootfs,虚拟机安装nfs服务器驱动开发步骤:驱动源码和makefile编写,编译insmod安装模块,测试,rmmod卸载模块常用的模块操作命令:lsmod,打印当前内核已经安装的模块insmod xxx.ko 安装xxx.ko模块modinfo xxx.ko 打印xxx.ko模块信息,注意模块版本和内核版本必须一致,否则安装报错:Invalid module formatrmmod xxx 卸载原创 2020-07-03 16:20:53 · 356 阅读 · 0 评论 -
内核的启动过程粗略分析
主Makefile分析:刚开始定义了kernel的版本号make 编译内核时,也可以通过make O=…传参(和uboot一样)指定编译目录两个重要的变量 ARCH,CROSS_COMPILE决定了架构和编译工具链路径,这两个参数也可以通过make时传参例:make O=/tmp/mykernel ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-链接脚本分析:找到整个程序的入口原创 2020-07-01 09:59:41 · 173 阅读 · 0 评论 -
kernel 的配置过程和原理
内核的配置编译过程:进入root用户下操作(以防没有权限):使用移植好的内核,解压执行make distclean 清理打开主makefile文件,确认CROSS_CONPILE路径和自己安装的交叉编译工具一致CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-确认架构一致ARCH = arm执行make xx_defconfig 生成.config配置文件这里使用的是x210ii_qt_原创 2020-06-29 14:19:40 · 1118 阅读 · 0 评论 -
linux内核基础理解
操作系统的核心功能:内存管理进程调度硬件设备管理文件系统操作系统的扩展功能:协议栈应用程序包linux内核只有一个:下载地址www.kernel.org发行版有很多,Ubuntu,redhat。。。驱动和内核的关系:驱动属于内核的一部分:驱动就是内核中的硬件管理模块驱动工作再内核态驱动程序故障可能导致整个系统崩溃驱动程序漏洞会使内核不安全应用程序和内核的关系:应用程序不属于内核,而是在内核之上的应用程序工作在用户态,是受限制的。应用程序故障不会导致内核崩溃原创 2020-06-28 18:35:54 · 173 阅读 · 0 评论 -
UBOOT的命令体系分析
命令体系基本概述:uboot启动后进入命令行模式,即可输入命令uboot会进行命令接收,命令解析,命令执行操作uboot的命令体系实现代码在uboot/common/cmd_xx.c中(command.c 和main.c也和命令相关)每个命令都对应一个函数有些命令支持传参(和main参数传参差不多),使用argc&argv传递,比如" print ipaddr "会以argc(2),argv(argv[0] = print,argv[1] = ipaddr)传递给命令函数命令体系解析原创 2020-06-24 20:45:47 · 190 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(六)uboot启动内核详解
操作系统内核本身也是一个裸机程序,但操作系统运行起来后在软件上分为内核层和应用层,两层权限不同,在内存访问和设备管理上更加精细。一个完整的软件+硬件嵌入式系统,未上电时,bootloader,kernel,rootfs等必须的软件都以镜像的形式存储在启动介质中,在x210中存储介质是SD卡、iNand。运行时都是在DDR中,与存储介质无关启动过程就是将其从存储介质搬运到DDR内存,然后运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到稳定状态。未上电时,u-boot.bin,zImage,原创 2020-06-24 15:08:24 · 336 阅读 · 0 评论 -
UBOOT常见命令 ping ipaddr
首先要插上网线连接主机和开发板1 开发板运行linux下和虚拟机ubuntu的ping通:虚拟机必须使用桥接方式虚拟机菜单中的“虚拟网络编辑器”要设置桥接到有线网卡,默认是自动连接到无线网卡,如果使用有线网卡连接开发板,必须设置此项虚拟机中使用ifconfig 命令设置IP地址(必须和开发板同一网段,即子网掩码一致)然后就可以执行ping命令了,开发板ping虚拟机、虚拟机ping开发板都可以2 开发板运行uboot下和虚拟机ubuntu的ping通:在开发板启动时进入uboot命令行原创 2020-06-22 22:00:24 · 2645 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(五) uboot启动第二阶段--start_armboot详解
uboot启动第二阶段要做的事情:宏观上来讲,就是要初始化剩下的还未被初始化的硬件,主要是SoC外部硬件(网卡,iNand等)和uboot本身的一些东西(uboot命令,环境变量等).uboot在何处完结:uboot启动后自动运行,打印一些信息(这些信息是uboot第一阶段和第二阶段初始化时打印的),然后uboot进入bootdelay,倒数完后执行bootcmd的启动命令,启动OS后uboot就消亡了。在uboot的bootdelay时,用户可以选择按下回车打断uboot进入uboot的命令下,原创 2020-06-22 18:43:56 · 498 阅读 · 0 评论 -
uboot1.3.4源码,start_armboot函数,分析(1)
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { hang (); } }分析,指针类型,方法,目的原创 2020-06-22 14:56:13 · 129 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(四) start.S文件详解--uboot第一阶段
整个项目的入口:start.S文件,由链接脚本的ENTRY声明确定第一部分:头文件包含:#include <config.h>#include <version.h>#if defined(CONFIG_ENABLE_MMU)#include <asm/proc/domain.h>#endif#include <regs.h>#ifndef CONFIG_ENABLE_MMU#ifndef CFG_PHY_UBOOT_BASE#defin原创 2020-06-21 14:13:44 · 590 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(三) uboot配置过程
/mkconfig文件分析:mkconfig脚本的6个重要参数:在主makefile文件中配置:x210_sd_config : unconfig#$(@:_config=)表示目标的_config用“ ”代替,即得到x210_sd @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 #输出TEXT_BASE变量值到 ../x210/config.mk @echo "TEXT_BASE = 0xc3e00000" >原创 2020-06-20 13:20:17 · 332 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(二) 主makefile分析
版本号(24–29行):记录uboot版本号VERSION = 1PATCHLEVEL = 3SUBLEVEL = 4EXTRAVERSION =U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)VERSION_FILE = $(obj)include/version_autogenerated.h生产一个变量U_BOOT_VERSION存放版本号1.3.4xx 。编译时生产文件version_au原创 2020-06-20 09:20:09 · 204 阅读 · 0 评论 -
UBOOT1.3.4 学习笔记(一) uboot配置、编译及源码目录分析
一.配置以为S5PV210开发板移植的uboot为例uboot根目录下执行make x210_sd_config二.编译编译前要先进行检查:检查当前编译环境是否已经安装合适的交叉编译工具链。当前选用arm-2009q3交叉编译工具链。检查主makefile文件中设置的交叉编译工具链路径和名称是否和当前安装的一致。makefile中设置如下:ifeq ($(ARCH),arm)CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none原创 2020-06-19 18:52:03 · 442 阅读 · 0 评论 -
Linux下的shell脚本(bash,sh)简单介绍 学习笔记
1 shell脚本的运行机制解释运行,无需编译链接.2 第一个shell脚本hello.sh#!/bin/shecho "hello.world"#为注释符,第一句表示shell程序被/bin目录下的sh解释器执行.第二句 echo 相当于printf .3 Linux下执行shell脚本的三种方法./hello.shsource hello.shbash hello.sh (bash是脚本解释器)输出结果是hello.world4 shell中的变量定义和引用she原创 2020-06-18 18:38:40 · 698 阅读 · 0 评论 -
S5PV210启动过程 笔记
1.关看门狗看门狗是默认工作的,首先关看门狗防止系统复位。2.初始化时钟设置机器运行频率3.设置SVC栈便于调用C程序4.开icacheicache用来缓存CPU指令,关了也能运行,慢点罢了。5.初始化SDRAM初始化内存,共27个步骤,参考数据手册。6.重定位解决连接地址和运行地址不一致且存在位置有关码的问题关看门狗,初始化时钟,设置SVC栈,开icache 在S5PV210芯片 IROM里的BL0已经实现过了。...原创 2020-06-13 21:02:08 · 158 阅读 · 0 评论 -
栈的作用 学习笔记
1.作为局部变量的存储域, 包括函数的非静态局部变量以及编译器自动生成的其他临时变量2.上下文切换时保存数据3.传递参数:汇编调用C函数进行传参原创 2020-06-13 20:40:11 · 270 阅读 · 0 评论 -
BCD码转换函数 学习笔记
十进制数转为BCD码unsigned int num_2_bcd(unsigned int num){ return (((num / 10)<<4) | (num % 10));}BCD码转为十进制unsigned int bcd_2_num(unsigned int bcd){ return (((bcd & 0xf0)>>4)*10 + (bcd & (0x0f)));}原创 2020-06-13 19:15:29 · 662 阅读 · 0 评论 -
S5PV210中断系统学习笔记 IRQ和FIQ中断
CPU如何保证FIQ(快速中断模式)比IRQ(普通中断模式)响应更快的?1.FIQ模式有专用的r8—r12寄存器,所以保护现场时不用保存到栈中。2.FIQ中断在中断向量表的最后一个异常向量入口,因此ISR无需跳转,可以直接写在原地,节省了跳转的时间...原创 2020-06-12 18:17:02 · 263 阅读 · 0 评论 -
S5PV210中断系统 学习笔记
以按键为例:按键按下,中断发生,经过异常向量表跳转到IRQ_handle函数,IRQ_handle 在汇编启动代码start.s中定义。IRQ_handle: // 设置IRQ模式下的栈 ldr sp, =IRQ_STACK // 保存LR // 因为ARM有流水线,所以PC的值会比真正执行的代码+8, sub lr, lr, #4 // 保存r0-r12和lr到irq模式下的栈上面 stmfd sp!, {r0-r12, lr} // 调用irq_handler函数(这是真正处理中断程原创 2020-06-12 16:43:53 · 267 阅读 · 0 评论