进程栈的初始化

   之所以写这个主题,是因为之前对于进程或程序的栈初始化及内容的概念是模糊的,而这个概念又具有一定的代表性,比如linux引导,普通进程运行启动等等。    一般进程刚开始启动的时候,是需要知道一些进程运行环境的,最基本的就是系统环境变量和进程的运行参数,这里最常见的一种做法是操作系统在进程启...

2018-07-25 22:48:29

阅读数 268

评论数 0

一种巧妙的swap函数实现方式

    我们偶尔会使用swap翻转函数,我们一般想到的实现方式如下:    void swap(int a, int b) { int temp; temp = a; a = b; b = temp; }    上面的代码还是比较容易理解的,使用一个中间变量...

2018-07-22 12:08:41

阅读数 496

评论数 0

__cplusplus、extern “C”关键字

    我们在阅读程序时,经常会见到__cplusplus关键字,比如下面的代码: #ifdef __cplusplus extern "C" { #endif void *memset(void* ,int , size_t); #ifdef __cp...

2018-07-22 11:21:26

阅读数 768

评论数 0

汇编中调用C中的函数,函数名前加下划线“_”

   之前见过这种用法,但是不太清楚为什么,就以为是约定俗成,其实也算是约定俗成,这样做的目的是为了防止符号名冲突,因为在一个程序中往往是包含汇编和C文件的,汇编用于启动部分,C文件用于应用程序,最终通过编译器实现编译,对于编译器来说,汇编和C是一视同仁的,那么就会有个问题,如果在汇编和C文件中使...

2018-07-21 22:54:05

阅读数 689

评论数 0

程序 目标文件结构及bss段分析

    对于我们写好的程序,最终会生成目标文件,那么目标文件的内部结构是如何呢?     目标文件一般包含编译后的机器指令代码、数据,还有链接是所需要的一些信息,比如符号表、调试信息等,而且一般目标文件会将这些不同的信息按照不同的属性,以“节(section)”也叫“段(segment)”的形式...

2018-07-21 20:32:20

阅读数 297

评论数 2

编译和链接背后的机制

   我们开始程序一般会用IDE,也就是集成开发环境,比如Visual Studio、Keil、IAR等,IDE的出现极大的解放了程序员的工作,使得程序员不用再去关注过于底层的物理性的操作,而只去关注应用层面的开发,但是也有缺点,就是对于我这种想象力不强的笨程序员来讲,对于一些底层操作,很难直观的...

2018-07-20 22:53:17

阅读数 99

评论数 0

Nor Flash芯片内执行(XIP)

    前言:这个所谓的芯片内执行(XIP)对于我这种一根筋的人是很难理解的,一直总觉得CPU是只能在RAM中运行程序,为毛能够在Nor Flash中执行程序呢,这里面就有个概念容易混淆,也可能是翻译理解的问题。    所谓片内执行不是说程序在存储器内执行,CPU的基本功能是取指、译码、运行。No...

2018-07-13 18:07:41

阅读数 2878

评论数 0

NOR Flash擦写和原理分析 (一)

1. NOR FLASH 的简单介绍          NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行).这点和NAND...

2018-07-13 16:26:10

阅读数 2421

评论数 0

汇编和C交叉调用

    汇编和C的交叉访问也是很常见的,汇编中访问C,是因为一般上电初始化只能用汇编,但是汇编语言毕竟不是高级语言,想要简单实现复杂功能,就需要在汇编中调用C,而C中调用汇编,多是因为需要直接跟底层硬件打交道,所以需要C中引用汇编,简单的说几种:一、汇编程序中访问C程序变量    (1)在汇编中,...

2018-07-06 22:38:24

阅读数 761

评论数 0

汇编:import和export

    import:翻译为进口或引入,表明要调用的函数为外部文件定义    export:翻译为出口或输出,表明该符号可以被外部模块使用,类似于C中的extern功能。...

2018-07-06 21:17:45

阅读数 1385

评论数 1

__inline 关键字使用

    inline关键字是用于函数声明或定义,可以把函数指定为内联函数,而且关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前是不起任何作用的。    inline的作用是什么呢?为什么要引入inline功能呢?简单的讲inline的作用与 宏定义 作用...

2018-07-05 22:44:21

阅读数 2672

评论数 0

数据栈简单使用规则

    首先一定要明白一点,“栈”和”堆“本质上是一小块”内存“,用于程序的运行中存放中间变量。    栈有很多种,这里介绍最常见的一种所谓FD型栈,即数据栈内存地址从高向低呈减小的方向增长,栈指针指向栈顶元素,这里的栈顶其实也是“低”地址。        上图中包含了下面的概念:    (1)数...

2018-07-05 22:03:47

阅读数 289

评论数 0

IAR之 Use CMSIS

    在使用IAR时,尤其是从MDK转到IAR编程时,这个Use CMSIS会困扰很多人,当然也包括我,这个要不要勾选,会出现n多的编译错误,下图所示:     这里有一个概念“CMSIS”,这个是ARM公司做的微控制器软件接口标准,CMSIS:Cortex Microcontroller So...

2018-07-04 14:09:57

阅读数 1374

评论数 2

uboot之 relocate功能代码分析

uboot的relocate功能代码是分析uboot的必经之路,非常巧妙,也非常经典,当然理解起来也有些麻烦:.globl _start _start: b reset ...... ...... ...... ...... ...... _TEXT_BASE: .wor...

2018-07-03 22:38:40

阅读数 432

评论数 0

u-boot1.1.6之arm920t/start.S

 这是学习uboot的必经之路,看似简单,但是包含的内容却一点都不简单,下面的理解只是此时此刻,可能还是会有错。.globl _star_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrup...

2018-07-03 21:54:24

阅读数 70

评论数 0

.word 汇编指令

    在汇编文件中经常见到“xxx: .word  expression”    这里的用法就是 在当前位置放一个word型的值,这个值就是expression,    举例来说:    _rWTCON:          .word 0x15300000       就是在当前地址,即_rWT...

2018-07-03 21:35:07

阅读数 1523

评论数 0

LDR命令

    LDR指令用于从内存中将一个32位的字读取到指令中的目标寄存器中,如果目标寄存器为PC,则可以实现“长”跳转。主要有一下3种方式使用:ldr r0,_start ldr r0,=_start ldr pc,_start   逐条分析:一、ldr r0,_start    从内存地址_sta...

2018-07-03 21:01:55

阅读数 3051

评论数 0

ADR伪指令

    这是一个特别有意思,有难度的指令,理解起来确实比较绕。    ADR——小范围的地址读取伪指令,该指令将基于PC的地址或基于寄存器的地址值读取到寄存器中。    这里特别注意,是“基于PC”,不是什么链接地址、绝对地址啥的,很固定,一定是基于PC.    语法格式: ADR {cond} ...

2018-07-03 16:51:04

阅读数 299

评论数 0

ARM9——五级流水线结构,以及PC指针

    ARM7是三级流水线,所以PC = 执行指令地址 + 8,这很好理解,但是在ARM9中,是五级流水线,仍然是:PC = 执行指令地址 + 8,而不是 PC = 执行指令地址 + 16.    这个理解显然有些难度,首先看下ARM7和ARM9的流水线区别和联系:        相比ARM7,...

2018-07-03 15:44:52

阅读数 1224

评论数 0

ARM——三级流水线结构,以及PC指针

    首先科普几个概念:    MIPS——Million instruction Per Second 每秒多少百万条指令,比如0.9MIPS,表示每秒90万条指令。    MIPS/MHz表示CPU在1MHz的运行速度下可以执行多少个MIPS,比如0.9MIPS/MHz表示如果CPU运行在1...

2018-07-03 14:54:47

阅读数 661

评论数 0

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