ARM学习笔记

=====================================================day01======================================================
硬盘:永久记忆
内存:临时记忆
电源:
CPU:大脑里的一部分
C语言函数:用户自定义,库函数,第三方写的
内存(放指令和数据) 指令(程序员写的程序)
指令的执行是由cpu来执行的
一条指令:取指 译码 取数据 执行 存数据
编译过程:
    预编译->编译(生成.i文件)->汇编(把.i文件翻译成二进制)->连接(将多个.o文件和库文件连接起来合成一个可执行文件)
gcc hello.c -o hello1 -Wall 动态链接库文件
gcc hello.c -o -Wall hello2 -static静态链接库文件 hello2的大小比hell1的大
动态链接把相同的代码放在一块内存里,静态链接每个.o文件都含有一个相同的代码区
一个程序在内存中运行就是一个一个进程占的内存分几个区:堆区 栈区 数据区 代码区

计算机组成:硬件+软件
计算机系统层次结构:
    复杂计算机系统:应用程序(APP) 中间件(MidWare) 操作系统(OS) 裸机(硬件)
    简单计算机系统:裸机程序(软件) 裸机(硬件)
============================================day02================================================================
C、C++、系统编程、网络编程、数据结构、数据库
1、嵌入式系统的分类
    按表现形式分(硬件范畴):芯片级嵌入(soc),模块级嵌入(单板级),系统级嵌入(多板级、设备级)
    按实时性要求分(软件范畴):非实时系统(PDA),软实时系统(消费类产品),硬实时系统(工业和军工系统)
2、嵌入式处理器
    微控制器(MCU):单片机 把CPU RAM ROM集成在一个芯片上
    微处理器(MPU):
    数字信号处理器(DSP)
    片上系统(SOC):system on chip 将外设控制器和CPU集合在一个芯片上 实现软件编程
    可编程片上系统(SOPC):实现硬件编程
    多核嵌入式处理器(MultiCOre SOC):
多任务实现:一个时刻只有一个任务在运行,我们看到多个任务在一起同时运行是因为他们的时间间隔太小了所以看到就是同时运行的
软件行业:SE(软件工程师),Tester(软件测试工程师),SCM(软件配置管理),SQA(软件质量保证),SPM(软件项目管理)
    软件工程师:需求分析->设计->编程->测试
    软件测试工程师:白盒测试(写代码检查别人写的代码),黑盒测试(通过操作来检查代码)
    软件配置管理:将需求分析,设计文档等提交到服务器上面
    软件质量保证:监控流程
    软件项目管理:
机器语言:二进制语言
汇编语言:
==============================================day03=================================================================
cache可提高系统的效率,但不是计算机必须的
MPU和MMU
32位系统下ARM指令在内存里的方法:四个字节来存放一条指令,每条指令在内存空间的首地址是4的整数倍
cpu构造:
    寄存器组:
    控制器:
    ALU:
计算机世界的一切信息=二进制位+上下文
冯洛伊曼:二进制思想,程序存储和程序控制
函数指针理解:qsort 写一个冒泡排序函数
互联网:电脑和电脑连在网络上
移动互联网:手机上网
物联网:随便一个物体的联网专用计算机的上网
云计算:服务器提供内容和计算
大数据:大量数据分分析计算

寄存器工作模式:
用户:正常程序工作模式
系统:R0~R15+CPSR
快中断:自己的R8~R12 SPSR
中断:用于通用中断处理
管理:R0~R12 R13 R14 SPSR R15 CPSR
中止:比如没有取到指令
未定义:
37个寄存器:
10:R0-R7 R15 CPSR所有模式共用寄存器
10:(R8-R12)*2
12:(R13 R14)*6
5:SPSR*5

1)R15寄存器存的指令的地址,执行指令的时候来这里取指令的地址
    指令的执行:
        顺序执行
        跳转执行:选择(if...else,switch),循环,goto,break,continue,函数调用,函数返回(return)
2)CPSR:Current Program Status Register
    保存程序状态
    0~4位:模式位
    第5位:0:ARM状态 1:thumb状态
    第6位:快中断屏蔽 1屏蔽快中断
    第7位:中断屏蔽 1屏蔽中断
    .....
    高4位:N Z C V
    N(negative):正数负数 1表示运算结果为负数
    Z(zero):1表示运算结果为0
    C(carried out):加法进位,减法借位则置1
    V(overflowed):溢出标志
3)SPSR:Saved Program Status Register
    保存CPSR即备份CPSR
4)R13(SP):堆栈指针
堆栈:
数据结构:研究元素与元素之间的逻辑关系,研究元素在内存里的存储方式
字符串常量:位于位于数据区的只读的以'\0'结尾的名称叫"..."的字符数组:"hello"[];这种写法是对的
5)R14:链接寄存器(LR)
发生中断时,CPU取执行处理异常服务程序,处理完回到原来中断处继续执行,怎么回到原来那里呢?R14保存的下一条指令的地址,回去的时候再读R14就链接到原来中断处了


阻赛:没有取到则等待
非阻赛:没有取到返回错误信息
中断:唤醒睡眠的一种手段
任务的五个状态:就绪,运行,睡眠(),僵死(进程已经退出但是资源还占用着),暂停
僵尸进程:子进程退出,父进程没有对子进程的资源进行善后处理,用wait_pid()函数来处理其资源

    
NULL相当于零地址是一个宏 #define NULL (void *)0;零地址操作系统在用,所以 不能操作零地址(不能读不能改写)
int *p=NULL;
printf("%d",*p);//error不能操作零地址


========================================================day04================================================
ARM指令
ADD R3,R2,R1;R1+R2放到R3
立即数合不合法判断:对应的数写成二进制高位低位去掉连续的偶数个0
0X03F8->0000 0011 1111 1000->11 1111 10 在0~255之间合法的立即数
0X1FA->0001 1111 1010-> 01 1111 1010 大于255不合法的立即数
四种类型的堆栈方式:
    FA:满递增
    FD:满递减
    EA:空递增
    ED:空递减
============================================================day04=============================================
1.NAND flash分区:
bootlaoader(0~0x40000)0x40000字节大小,放裸机可执行文件
param(ox40000~0x60000)0x20000字节大小,放一些需要的参数
iimage(0x60000~0x560000)0x500000字节大小,放裸机可执行文件
rootfs(256M-ox560000)字节大小 ,放一些app运行所需要的东西 rootfs.img文件下
 2.安装sudo apt-get install minicom
 mincom 用于接收板子上bootloader上通过串口传过来的信息所以刚启动在电脑上就可以看到一些信息
 
 MVC:DataModel View Controler
 
 chmod +x ./dnw2
 内存地址的分布:
 真正的物理内存只有64M,
 
 ================================day05========================
1.NOR
make distclean//彻底清除中间文件,包括配置文件
make mini2440_config//配置开发板,生成一些配置文件
make//生成真正的u-boot.bin文件
2.从新打开一个终端执行sudo ./dnw2 ????/u-boot.bin
    2)串口
      a. loadx(uboot命令行)
      b. ctrl+a松开后按s键
      c. 选择xmodem
      d. 输入要下载文件的路径和文件名
    3)U盘
      a. U盘文件系统必须为FAT32,如果不是请重新格式化U盘,
         并拷贝u-boot.bin到U盘
      b. 将U盘插入开发板扁口USB
      c. u-boot命令行键入命令: usb start
      d. u-boot命令行键入命令: usb part (目的为得到第几个U盘的第几分区)
      e. u-boot命令行键入命令: fatload usb m:n 0x30008000 u-boot.bin //
         下载u盘里u-boot.bin文件到内存


tftp是客户端
netstat -a|grep tftp //|是管道
============================================day07=================================
type+命令:查看命令属性

if(likely(i!=0))//likely关键字告诉我们i!=0这个条件大多情况为真,只是为了方便阅读
内核编程特点:
    没有内存保护机制
    不要轻易在内核中使用浮点数
    容积小而固定的栈(32位机8k 64位机16k)
    同步和并发(两个任务并行的时候要解决资源共享问题)
    可移植性的重要性(字节序,字节对齐)
    
进程:是基本的执行单元,包含cpu执行的代码(执行单元),基本的分配单元(每个进程都有自己独立的栈区,数据区,代码区)
线程:只是基本的执行单元,不是分配单元,多个线程录属于一个进程,数据区、代码区是共用的,栈区不是共享的只能是每个线程独有自己的栈区,全局变量语
     句在main函数执行之前被执行
进程-线程(工厂-流水线),多进程-多个工厂,流水线是属于一个工厂的不能单独存在,工厂的食堂,财务处,澡堂等是共享的
进程/线程五个状态:就绪,运行,睡眠,暂停,僵死
睡眠(等待资源的出现):深度睡眠只有资源就位才能唤醒,浅度睡眠信号和资源就位都可唤醒
阻赛和非阻赛是针对函数而言的
僵死(子进程退出但资源还没释放,wait函数等待进程退出码(主函数返回值),对退出进程善后处理(对进程收尸))
pthread_join对线程处理等待线程退出码
 暂停不是停止
 睡眠不是阻赛
 僵死不是死亡

进程分类:
    IO消耗型(PPT放映)
    处理器消耗型(函数不停调用(非阻赛函数)没有资源则返回再循环调用函数直到资源就位)
select多路复用
写函数write也是阻赛的当写的设备已经塞满了写不下了就会阻赛
值参数:只读
结果参数:只写
值结果参数:又读又写
内核空间不能随便访问

异常服务程序不属于任何一个任务
用户进程、用户线程、内核进程、异常服务(不能睡眠)
linux编码风格:
    缩进:制表符8个字符长度,反对多层缩进,,每行最多80个字符
    switch与case同列
    空格:空格放在关键字周围#include <stdio.h>
        函数名和括号之间无空格
        二元、三元前后加空格,一元不加空格
        函数参数前后不加空格
    指针类型*号紧跟变量名 int *p;
    花括号:
             if(){
              ...
              }
              或
              if()
              {
              ..
              }
              
//开关宏 #define AAA 一般以下用法
#define AAA
#ifdef AAA
...
#endif
骇客帝国
驱动程序要求:英语,硬件原理图,C语言
设备分类:
    字符设备:字节流顺序读写
    块设备:一块一块的交互不能按字节来读写
    网络设备:
make menuconfig//

 config MY_HELLO_MODULE//config 表示会在
   tristate "hello sample"
   depends on MACH_MINI2440
   default m if MACH_MINI2440
   help
     Mini2440 module sample.
make modules 编译被选中为M的文件为.o文件
insmod+hello.ko//
 lsmod查看动态执行的模块有哪些
 
//cd opt/->rx hello.ko->insmod hello.ko->lsmod->rmmod myhello
//.ko文件不和源码文件放在一起
    a.Makefile编写/home/yinxili/project/arm vim Mkaefiel(修改文件路径和目标文件名.o文件。)
    b.将myhello.c文件拷贝到/home/yinxili/project/arm目录下(与Makefile在一个文件夹)
    c.make
    cd opt/->rx hello.ko->insmod hello.ko->lsmod//rx hello.ko时将.ko文件路径复制
    
int a=2;
int b=0;
b=sizeof(a++);//编译期间就确定了
//a=2,b=4(32bit)
内存错误操作:(*代表严重性)
    1)内存泄漏*****
    2)数组越界****
    3)重复释放**:float *pf=malloc(12);free(pf);free(pf);*pf=12;//
    4)野值**:int a;int b;b=a*3
    5)野指针(空指针)***:有以下几种野指针
        1.int *p;*p=10;//这个不一定会死,不知道p指向哪,野指针
        2.int *p=NULL;*p=10;//这种不一定会死,0地址系统在用,空指针
        3.float *pf=malloc(12);free(pf);*pf=12;//空间已被释放
    6)修改字符串常量**
=================================day08================================================================
1.寄存器器:状态寄存器,数据寄存器,控制寄存器
static int globalmem_ioctl(struct inode *inodep, struct file *filp, unsigned
  int cmd, unsigned long arg)*
  cmd:
  arg:
//当进不去linux驱动命令行时  
printenv
setenv bootargs noinitrd root=/dev/mtdblock3 console=ttySAC0 init=/linuxrc
saveenv
//------------------------------------
cat buttons
echo $pwd
echo 123 > /dev/a
a    

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值