自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于C语言中结构体对齐问题

嵌入式C语言之struct内存分配(对齐) 为了提高CPU的存储速度,对一些变量的起始地址做了“对齐”处理。在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。#pragma pa

2017-08-12 22:58:00 354

原创 关于C语言数量类型的转换

今天做了几题关于C语言数据类型转换的题目,感觉自己是懂非懂,于是决定在研究研究。首先,C语言数据类型的自动转换遵循以下规则(这是经常用到的,还有其他规则这里没有写齐全,可自行百度):若参与运算量的类型不同,则先转换成同一类型(更高的),然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。 a. 若两种类型

2017-08-09 12:58:02 685 1

原创 poll机制之内核实现简要分析

int poll(struct pollfd *fds, nfds_t nfds, int timeout); 意思就是说poll函数功能类似select函数,即等待文件描述符可进行I/O操作,比如数据的读写,标准输入之类的。文件描述符被fds所监听,当发生fds中的事件poll就返回。(即将调用poll的进程加入对应内核驱动的等待队列,等待数据可读,或超时就唤醒)先来个大概的流程:当我们在

2017-08-07 23:13:44 695

原创 linux内核中2410_gpio_cfgpin函数分析

2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPIO_OUTPUT) 函数分析:作用设置相应GPIO口的工作模式,输入、输出、中断等。 一,首先宏展开:为方便描述,展开后用等号表示#define S3C2410_GPIO_OUTPUT (0xFFFFFFF1) #define S3C2410_GPB0 S3C2410_GPIO

2017-08-06 17:05:51 508

原创 字符设备驱动学习(2)

学习目标:在字符设备驱动学习(1)的按键查询基础上改为按键中断。1、什么是中断 中断是异常的一种,异常就是可以打断cpu正常运行流程的一些事情,比如外部中断、未定义指令、swi指令。cup暂停当前的程序,先处理异常事件,然后再继续执行被中断的程序。2、linux内核对异常的设置 内核在strrt_kernel函数中调用了trap_init函数和init_IRQ函数来设置异常的处理函数。 ①me

2017-08-05 23:39:55 246

原创 字符设备驱动学习(1)

首先,以查询方式的按键驱动开始字符设备驱动的学习。 目的:按键驱动查询方式获取按键值: 1、写出驱动框架 2、硬件操作,相关实现。1.写出框架:对于驱动的学习,框架思想非常重要。 1.1.file_operation: file_operation 结构是一个字符驱动如何应用程序建立连接. 这个结构, 定义在 linux/fs.h中, 是一个函数指针的集合. 每个打开文件与它自身的函数集合

2017-08-03 23:55:59 223

原创 嵌入式工程师面试题——常见字符串编程小题目

写一个程序,从键盘输入字符,然后对字符进行逆序操作//采用递归的方法实现void myprint(char ch){ if((ch = getchar()) != '#') { myprint(ch); printf("%c",ch); }}int main(){ char ch; ch = getchar();//在

2017-07-29 10:52:21 931

原创 提升嵌入式开发效率小技巧——开发环境配置

起因:发现自己在嵌入式开发是,主机、虚拟机、开发板相互不能ping通,代码文件拖来拖去,利用cutftp,拖文件还得改目录,开发效率极低,加上bug找不到,代码写不出,使心情更加烦躁,进而磨灭自己的热情。开发板:zj2440 主机:win7 64位 linux:Ubuntu 14.04目标:实现主机、虚拟机、开发板相互能ping通,而且虚拟机能够上网,并配置samba服务器,提升开发效率 效率

2017-07-27 19:20:36 862

转载 嵌入式开发必备SPI、IIC,高手带你理解SPI中的极性CPOL和相位CPHA

文章出处:嵌入式开发必备SPI、IIC,高手带你理解SPI中的极性CPOL和相位CPHASPI由于接口相对简单(只需要4根线),用途算是比较广泛,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。即一个SPI的Master通过SPI与一个从设备,即上述的那些Flash,ADC等,进行通讯。而主从设备之间通过SPI进行通讯,首先要保证两者之间时钟SCL

2017-07-15 21:34:45 442

原创 C++——运算符重载

运算符重载 运算符重载基础:运算符重载就是对已有的运算符赋予新的含义,实现新的功能。<<是C++中的左移运算符,但是在输出操作中与cout配合被称为流插入运算符,可以进行输出。>>是右移运算符,与cin配合使用被称为流提取运算符。它们都被称为运算符重载。我们也可以根据我们的需要对C++中现有的运算符进行重载,来赋予这些运算符新的含义。运算符重载的规则被重载的运算符必须是已经存在的C++运算符,不

2017-07-09 19:16:13 404

原创 文件系统学习(3)

一、说在前面:在嵌入式中呢,首先uboot的最终目的是启动我们的内核,内核的目的是启动我们的应用程序。怎么启动的呢? 我们来分析下init_post()这个函数;static int noinline init_post(void){ ....... if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)

2017-06-21 16:29:10 228

原创 文件系统学习(2)

常用嵌入式文件系统 在类Unix系统中一切都是文件,那么Linux是如何将系统的运行信息、设备信息等抽象成文件进行管理的? Linux内核实现了一套特殊的内存虚拟文件系统用于使用与文件接口统一的操作来完成系统信息管理,它们包括: procfs、devfs、sysfs。关于基于逻辑的虚拟文件系统分析1、进程文件系统:procfs 2、设备文件系统:devfs、sysfs 一、procfs p

2017-06-19 22:20:34 453

原创 文件系统学习

一、Linux文件系统 目录结构 树形结构:倒立 —— 根目录 /二、根文件系统概念 1. 是什么 内核第一个挂载的文件系统,包含Linux系统完整启动所需的目录结构和重要文件 其它所有文件系统进行挂载使用的载体 2.为什么 Linux完整启动的需要,进入用户态操作环境:VFS设计 提供了良好强大的文件系统扩展性三、根文件系统形式

2017-06-19 22:04:26 333

原创 嵌入式Linux内核启动参数介绍与设置

软件子系统各组成部分之间的层次与关联,怎样相互识别、配置与加载? 一、系统启动流程bootloader(uboot) ————> Linux Kernel(uImage) ————> Rootfs(Init) ————> Applications二、启动环境配置 uboot环境变量: printenv setenv saveenv tftpboot nand read/write

2017-06-14 21:16:00 2805 1

原创 关于C语言中*与++的组合问题解析

后缀++假如需要将一个值存入一个数组元素中,然后再前进到下一个元素,那么利用数组下标可以这样写:data[i++]=j;如果pData指向数组元素,那么相应的语句为:*pData++=j;因为后缀++的优先级高于*,所以编译器将上述语句看成是:*(dData)=;pData++的值是pDdata,因为使用后缀++,所以pData只有在表达式计算出来后才可以自增,那么*(pData++)的值为*pDa

2017-06-08 21:52:55 2788

原创 编译内核错误:"mkimage" command not found - U-Boot images will not be built解决办法

ubuntu 14.04 64位系统编译内核时提示如下错误:In file included from arch/arm/boot/compressed/misc.c:30:include/asm/arch/uncompress.h:61: warning: conflicting types for built-in function 'putc' LD arch/arm/boot

2017-06-07 22:00:10 1413 1

原创 网络编程小练习

实例:多并发服务器小程序练习:编写一个服务器,可多个客服端进行对齐同时访问。采用多进程的方法实现。 功能:服务器端打印接收的字符串长度,和字符串,客服端ip,以及使用的端口,将服务器接收到的数据会送给客服端,当接收到q时,服务器就与客服端断开连接,关闭sockfd套接字,当接收到h时,向主机发送hello linux。#include <stdio.h>#include <stdlib.h>#

2017-06-03 23:57:44 231

原创 linux网络编程(2)

关于套接字(socket)的理解不同计算机(通过网络相连)上运行的进程相互通信机制称为网络进程间通信(network IPC)。 在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)构成套

2017-06-01 21:35:59 465

原创 linux网络编程(1)

1. socket文件描述符:套接字int socket(int domain,int type,int protocol)domain:用于指示协议族的名字,如AF_INET为ipv4.type:用于指示类型,如基于流通信的SOCK_STREAM。protocol:用于指示对于这种socket的具体协议类型,当前两个参数确定时,只存在一种协议类型,这时protocol为0;成功创建sock

2017-05-28 18:52:17 276

原创 面试问题收集总结

马上呢,自己也将奔波于招聘会宣讲会之中,进行一场又一场的面试,这里做一些面试问题和技巧的收集,希望对自己到时面试有帮助之处。1、你认为自己的哪项技能需要加强? 麻烦又来了,你不可能宣称自己无所不能,但如果你简单地承认自己在哪方面需要改进,高压面试主考就会像嗜血的鲨鱼一样一口咬住你。你该重新定义一下这个问题以便躲开这一点:“既然谈到这儿,我想说我已具备了这份工作所需的所有技能。这也是我所以对这个职位

2017-05-21 21:31:14 542

原创 linux线程学习(6)

1. 线程私有数据应用程序设计中有必要提供一种变量,使得多个函数多个线程都可以访问这个变量(看起来是个全局变量),但是线程对这个变量的访问都不会彼此产生影响(貌似不是全局变量哦),但是你需要这样的数据,比如errno。那么这种数据就是线程的私有数据,尽管名字相同,但是每个线程访问的都是数据的副本。在使用私有数据之前,你首先要创建一个与私有数据相关的键,要来获取对私有数据的访问权限 。这个键的类型

2017-05-19 18:27:43 195

原创 linux线程学习(5)

线程的高级属性1. 一次性初始化:有些事需要且只能执行一次(比如互斥量初始化)。因此有了使用一次初始(pthread_once_t);首先要定义一个pthread_once_t变量,这个变量要用宏PTHREAD_ONCE_INIT初始化。然后创建一个与控制变量相关的初始化函数pthread_once_t once_control = PTHREAD_ONCE_INIT;接下来就可以在任何时刻调

2017-05-18 19:30:19 234

原创 linux线程学习(4)

线程的同步1. 条件变量 提供线程之间的一种通知机制,当某一条件满足时,线程A可以通知阻塞在条件变量上的线程B,B所期望的条件已经满足,可以解除在条件变量上的阻塞操作,继续做其他事情。 我们需要这种机制,当互斥量被锁住以后发现当前线程还是无法完成自己的操作,那么它应该释放互斥量,让其他线程工作。 1、可以采用轮询的方式,不停的查询你需要的条件 2、让系统来帮你查询条件,使用条件变量pth

2017-05-17 17:25:37 241

原创 linux线程学习(3)

线程的同步1. 互斥量为什么要使用互斥量: 当多个线程共享相同的内存时,需要每一个线程看到相同的视图。当一个线程修改变量时,而其他线程也可以读取或者修改这个变量,就需要对这些线程同步,确保他们不会访问到无效的变量互斥锁的初始化和销毁: 为了让线程访问数据不产生冲突,这要就需要对变量加锁,使得同一时刻只有一个线程可以访问变量。互斥量本质就是锁,访问共享资源前对互斥量加锁,访问完成后解锁。当互斥

2017-05-16 19:10:07 174

原创 linux线程学习(2)

线程的生命周期1、当c程序运行时,首先运行main函数。在线程代码中,这个特殊的执行流被称作初始线程或者主线程。你可以在初始线程中做任何普通线程可以做的事情。 2、主线程的特殊性在于,它在main函数返回的时候,会导致进程结束,进程内所有的线程也将会结束。这可不是一个好的现象,你可以在主线程中调用pthread_exit函数,这样进程就会等待所有线程结束时才终止。 3、主线程接受参数的方式是通过

2017-05-15 19:54:02 199

原创 linux线程学习(1)

什么是线程及为什么要有线程?有时又称轻量级进程,程序执行的最小单位,系统独立调度和分派cpu的基本单位,它是进程中的一个实体。一个进程中可以有多个线程,这些线程共享进程的所有资源。 进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程(即线程);二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。 多线程的优势:

2017-05-12 22:14:33 193

原创 linux进程间的通信

什么是进程间通信? 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共场所”,各进程均可以访问,所以内核也可以提供这样的条件。此外,还有双方都可以访问的外设。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据

2017-05-12 16:58:46 410

原创 数据结构——二叉树学习

什么是树树的定义:树是n个(n>=0)有限节点组成一个具有层次关系的集合。根及子树:在任意一个非空树中,有且仅有一个特定的称为根的结点,当n>1时,其余结点又可以分为m(m>0)个互不相交的有限集T1,T2,…Tm,其中每一个集合本身又是一颗树,并称为根的子树。数的基本术语:结点:树中包含一个数据元素和若干指向其子树的分支的集合叫做树的结点度:结点拥有的子树称为结点的度叶子(终端结点):度

2017-05-10 18:05:53 455

原创 uboot移植第五天——ldr和adr的用法

ldr命令语法 ldr有两种用法,分别是正常指令和伪指令 正常指令ldr{条件} 目的寄存器 ,<存储地址> - ldr r0 ,0x12345678 - 将地址为0x12345678的存储单元中的值存入r0寄存器ldr指令用于从存储器中将值存入寄存器中 -ldr pc,_underfine_instruction * _underfine_instruction

2017-05-08 21:53:46 346

原创 uboot移植第四天——代码分析(4)

这次的分析主要是针对uboot的第二阶段的分析,之前都是对第一阶段的分析,这个阶段都是人为划分的,你也可以不这样划分。 第二阶段入口ldr pc, _start_armboot_start_armboot: .word start_armboot这样就进入了第二阶段,u-boot-1.1.6\lib_arm下的board.c中的void start_armboot (void)函数执行。执行流程

2017-05-07 17:34:46 237

原创 uboot移植第三天——代码分析(3)

uboot中start.S相关代码分析重定位——即把falsh中的代码复制到ram(sdram)中,本开发板复制到sdram中。 不管我们开发板是以什么方式启动(nor/nand)启动,都需要进行重定位 因为: 当nor启动时,因为nor的特性,只能读不能写,因此需要从定位, 当nand启动时,nand启动只把前4k代码复制到片内内存,uboot打印4k,因此需要重定位。相应继续执行4K以后

2017-05-06 18:03:45 245

原创 uboot移植第二天——代码分析(2)

今天是uboot移植学习第二天,通过csdn博客记录自己的学习过程,希望通过这个方法,使自己所学的知识得到复习和扩展,总结经验发现不足,也希望自己的博客能够给人启发,疑问的到解决。uboot中start.S相关代码分析这次主要对代码分析(1)的第一阶段相关代码分析设置为管理模式 reset: /* * set the cpu to SVC32 mode */

2017-05-05 18:09:01 286

原创 uboot移植第一天——代码分析(1)

uboot版本 :u-boot-1.1.6 编译器 :gcc version 3.4.5 开发板 :jz2440.globl _start_start: b reset*跳转到reset执行*1、set the cpu to SVC32 mode——设置为管理模式 2、turn off the watchdog——关闭看门狗 3、mask all IRQs by settin

2017-05-04 18:00:01 330

原创 数据结构——递归学习

一、递归函数定义在高级语言的学习中,函数调用自己和调用其他函数并没有本质的区别,函数直接或者间接调用自己(函数本身)就称该函数为递归函数;二、递归函数的特点递归函数必须含有结束条件否则会陷入死循环;递归比迭代会消耗大量的时间和内存,函数反复调用返回,申请临时内存空间;调用和函数返回,递归的返回顺序是它调用的顺序的逆序;三、递归实例1、利用递归算法

2017-05-03 15:29:00 452

原创 数据结构——队列的学习

一、什么是队列队列实际上就是只能在一端插入(队尾),在另一端(队头)删除(出队)的特殊线性表;二、队列特点只允许在一端进行插入操作,一端进行删除操作,即入队、出队。有先进先出(FIFO)的特性;我们熟知的键盘缓冲区就用队列实现的(scanf函数就有运用这种特性);对于队列可以顺序存储,也可以链式存储;三、代码实例1、链式存储:实现简单的队列创建,

2017-05-02 19:52:44 308

原创 数据结构——栈的学习

一、什么是栈?栈是限制在一端进行操作(插入、删除)的线性表;我们俗称为堆栈;只不过是一种特殊的线性表,有顺序栈、也有链式栈二、栈的特点具有先进后出的特点,即先进栈的数据后出栈(LIFO);入栈出栈可交替进行;对于特点1、2经常出面试题目:一个栈的入栈序列为ABCDE,则不可能的出栈序列为? (AB)A:ECDBAB:DCEABC:DECBAD:ABCD

2017-05-01 21:02:46 336

转载 单片机两大延时方法总结

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和

2017-03-25 10:00:10 15246 2

原创 小题目练习

设score数组中存储8名同学的C语言成绩,字符串数组name中存储同学们的姓名。这两个数组中,每名同学的姓名与成绩的下标要始终保持一致(例如name[i]和score[i]表示同一位同学(下标为i)的姓名和C语言成绩,否则会张冠李戴)。(1)输出按成绩排序后的同学的名单;(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。#include#include#define num

2017-01-30 10:29:22 329

原创 关于学习getchar()和scanf()时问题

一、getchar()函数:getchar()函数的原型为 int getchar(void):该函数不带形参,返回值为int型,成功时,返回值为字符的ASCII码,出错是为-1.getchar()函数只对字符起作用,在stdio.h中定义,其实是个宏定义函数,是getc(stdin)的宏定义。如果用户在按回车之前,输入了多个字符,除第一个字符外其他保留在缓冲区中,等待后续函数调用读取

2017-01-14 12:46:58 1892

原创 getchar()函数与scanf()函数相关知识点

【项目1-字母及其编码】编写一个程序,从键盘上输入一个小写字母,显示这个小写字母及它所对应的大写字母以及它们的ASCII码值。#include #include int main(){ char ch; printf("请输入一个小写字母:\n"); scanf("%c",&ch); printf("小写字母%c对应的大写字母为%c,对应的ASC

2017-01-13 13:46:31 447

空空如也

空空如也

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

TA关注的人

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