自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 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 224

原创 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 154

原创 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 246

原创 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 170

原创 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 2940

原创 ‘inet_ntoa‘: Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disa

错误的原因在于从VS2013版本以上开始支持新的函数,使用旧的函数会报错。解决方法:1.修改VS配置,把SDL检查关闭2.看编译器推荐什么函数,用新函数替换旧的

2020-08-02 20:13:30 506

原创 简单多线程服务器,支持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 166

原创 linux下的命令,自用

用到过的记不住的命令:ulimit -n查看linux下一个进程可打开的socket数量,默认1024可用ulimit -n m改为m个待续

2020-08-01 14:08:25 73

原创 libjpeg开源库的使用

libjpeg库移植下载源码jpegsrc.v9.tar.gz与准备交叉工具链解压源码并进入解压后的目录。1.配置:/opt/libdecode 是自定义的文件夹,用来存放.so .a和头文件arm-none-linux-gnueabi 是交叉编译工具,改成自己的./configure --prefix=/opt/libdecode --host=arm-none-linux-gnueabi 执行之后会生成Makefile2.修改 Makefile:CC=gcc 改为 CC=a

2020-07-24 14:06:27 816

原创 LINUX下DEBUG宏

linux下DEBUG宏使用方法:#define DEBUG#ifdef DEBUG#define debug(...) { fprintf(stderr,"[debug][%s:%s:%d] ",)\ __FILE__,__FUNCTION__,__LINE__); \ fprintf(stderr,__VA_ARGS__); }#else#defin

2020-07-23 18:56:32 958

原创 UART,IIC,SPI

UART和USART:USART:通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)UART:通用异步收发器(Universal Asynchronous Receiver and Transmitter)同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。同步是阻塞模式,异步是非阻塞模式。UART是全双

2020-07-22 20:38:11 226

原创 tftp服务器在ubuntu 20上的搭建

以及,使用tftp远程下载linux内核到DDR中(注意加载地址),运行bootm启动内核

2020-07-21 12:41:34 980

原创 sizeof(数组名)和sizeof(指针)的区别

sizeof(数组名) 和sizeof(指针)的问题#include <stdio.h>void fun(char array[]);int main(){ char arr[] = "123456"; char *p = "123456789"; printf("%d\n",sizeof(arr)); //测试1 printf("%d\n",sizeof(p));//测试2 fun(arr);//测试3 return

2020-07-19 10:29:10 387

原创 运算符重载 学习笔记

运算符重载:赋予(扩展)运算符其他功能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 155

原创 多继承及二义性问题

多继承:一个子类继承多个父类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 507

原创 class成员权限和继承方式

对于一个类来说:(1)public 类内部可以访问,类的外部可以访问(2)private 类内部可以访问,类的外部不能访问(3)protected 类内部可以访问,类的外部不能访问protected权限是为继承存在的public继承父类的public成员,继承后在子类中是public的(权限没变)。父类的protected成员,继承后在子类中是protected的(权限没变)父类的private成员,继承后在子类中是“private”的,但是只能通过继承自父类的成员方法访

2020-07-16 10:38:18 390

原创 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 504

原创 C++调用C库

C++调用C库时,方法一:查看C库的头文件中有没有加extern“C”声明(应养成这个习惯,为了防止以后被C++调用),没有的话自己加上。#ifdef __cplusplus //C++中定义的宏extern "C"{#endifvoid func(); //函数声明。。。#ifdef __cplusplus}#endif方法二:如果C头文件没有定义extern “C”,可以在C++调用C头文件时用extern “C”将头文件包起来extern “C”{ #includ

2020-07-12 16:32:25 1598

原创 关于指针类型的写法

第一种:基本数据类型和类型修饰符放一起,与变量名用空格隔开int* a;这种写法在下面情况时会让初学者产生误解:int* a,b;//会让人误以为int* 同时作用于a和b实际上基本数据类型是 int 而不是 int* ,类型修饰符(*,&)仅仅修饰了变量名而已,对一条语句中的其他变量名 b 不产生任何作用第二种写法:修饰符和变量名在一起int *a;这种情况下会产生另一种误解:变量名是*a。实际上变量名只是 a, *不过是修饰符而已。总结:以上两种写法都正确,应当选择并坚持

2020-07-09 12:42:12 666

原创 指针和引用的区别 C++

引用指针引用本身不是一个对象指针本身是一个对象引用被定义时必须初始化,指向一个对象指针无需在定义时赋初值对引用的所有操作都是在操作与之绑定的对象指针本身是个对象,允许对指针进行赋值和拷贝等操作引用一旦确定,不能更改指向的对象指针在其生命周期内可以指向不同的对象因为引用不是一个对象(object):所以不能定义引用的引用(引用必须绑定一个对象)所以没有地址,因此不能定义 指向引用的指针(指针存放它指向的那个对象的地址)...

2020-07-09 10:22:41 93

原创 总线式扩展和非总线式扩展 的外设

通过总线连接的外设:DDR,norflash等,可以直接通过地址访问非总线式扩展:nand,SD等,需要通过一定的时序访问,所以需要IIC,SPI等通信协议

2020-07-09 09:36:57 153

原创 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 223

原创 驱动开发基础工作

驱动开发的必要条件:正常运行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 354

原创 内核的启动过程粗略分析

主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 164

原创 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 1092

原创 ubuntu zip解压和压缩

解压:unzip FileName.zip Dirname/ 压缩: zip -r Dirname.zip Filename/

2020-06-29 09:22:25 297

原创 linux内核基础理解

操作系统的核心功能:内存管理进程调度硬件设备管理文件系统操作系统的扩展功能:协议栈应用程序包linux内核只有一个:下载地址www.kernel.org发行版有很多,Ubuntu,redhat。。。驱动和内核的关系:驱动属于内核的一部分:驱动就是内核中的硬件管理模块驱动工作再内核态驱动程序故障可能导致整个系统崩溃驱动程序漏洞会使内核不安全应用程序和内核的关系:应用程序不属于内核,而是在内核之上的应用程序工作在用户态,是受限制的。应用程序故障不会导致内核崩溃

2020-06-28 18:35:54 168

原创 可重入函数和不可重入函数

简单来说可重入函数就是可以被中断的函数,该函数可以在被执行时中断而不会出现错误,不可重入函数由于调用了一些系统资源,如全局变量区,中断向量表等,被中断的话可能出现问题,所以不能在多任务环境下运行。一般满足下列条件的函数多数是不可重入的:(1)函数体内使用了静态的数据结构;(2)函数体内调用了malloc()或者free()函数;(3)函数体内调用了标准I/O函数。__interrupt double compute_area (double radius){ double

2020-06-25 20:03:32 502

原创 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 185

原创 UBOOT1.3.4 学习笔记(六)uboot启动内核详解

操作系统内核本身也是一个裸机程序,但操作系统运行起来后在软件上分为内核层和应用层,两层权限不同,在内存访问和设备管理上更加精细。一个完整的软件+硬件嵌入式系统,未上电时,bootloader,kernel,rootfs等必须的软件都以镜像的形式存储在启动介质中,在x210中存储介质是SD卡、iNand。运行时都是在DDR中,与存储介质无关启动过程就是将其从存储介质搬运到DDR内存,然后运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到稳定状态。未上电时,u-boot.bin,zImage,

2020-06-24 15:08:24 325

原创 使用fastboot命令给开发板刷系统

fastboot 是uboot中用来快速下载镜像的一个命令同时也是windows上的一个软件刷机前要装好驱动,还要连接usb线(fastboot使用usb传输数据)fastboot常用命令(在windows cmd下使用):fastboot devices 查看当前连接的设备fastboot flash xxx 烧录命令fastboot reboot 重启系统刷机过程:这是开发板已经烧录过uboot的情况下,如果是第一次需要使用SD或在linux中用dd命令或其他方式烧录uboot。

2020-06-23 16:23:06 1140

原创 UBOOT常见命令 ping ipaddr

首先要插上网线连接主机和开发板1 开发板运行linux下和虚拟机ubuntu的ping通:虚拟机必须使用桥接方式虚拟机菜单中的“虚拟网络编辑器”要设置桥接到有线网卡,默认是自动连接到无线网卡,如果使用有线网卡连接开发板,必须设置此项虚拟机中使用ifconfig 命令设置IP地址(必须和开发板同一网段,即子网掩码一致)然后就可以执行ping命令了,开发板ping虚拟机、虚拟机ping开发板都可以2 开发板运行uboot下和虚拟机ubuntu的ping通:在开发板启动时进入uboot命令行

2020-06-22 22:00:24 2593

原创 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 491

原创 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 122

原创 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 580

原创 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 319

原创 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 196

原创 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 434

原创 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 670

原创 运行arm-linux-gcc命令,提示No such file or directory”问题的可能原因

解决历程:1.查询发现有可能是系统不兼容问题:解决方法:安装ia32-libs (sudo apt-get install lib32z1)并没有解决2.发现文件夹带了个空格删掉空格解决

2020-06-16 21:47:56 1990

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除