精华内容
下载资源
问答
  • 1 寄存器地址的定义:#define UART_BASE_ADRS (0x10000000) /* 串口的基地址 */#define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0) /* 数据接受寄存器 */#define UART_THR *(volatile unsigned char...

    1 寄存器地址的定义:

    #define UART_BASE_ADRS (0x10000000)     /* 串口的基地址 */

    #define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0)  /* 数据接受寄存器 */

    #define UART_THR *(volatile unsigned char *)(UART_BASE_ADRS + 0)  /* 数据发送寄存器 */

    2 寄存器读写操作:

    UART_THR = ch; /* 发送数据 */

    ch = UART_RHR; /* 接收数据 */

    也可采用定义带参数宏实现

    #define WRITE_REG(addr, ch) *(volatile unsigned char *)(addr) = ch

    #define READ_REG(addr, ch) ch = *(volatile unsigned char *)(addr)

    3 对寄存器相应位的操作方法:

    定义寄存器

    #define UART_LCR *(volatile unsigned char *)(UART_BASE_ADRS + 3)  /* 线控制寄存器 */

    定义寄存器相应位的值

    #define CHAR_LEN_5 0x00

    #define CHAR_LEN_6 0x01

    #define CHAR_LEN_7 0x02

    #define CHAR_LEN_8 0x03    /* 8 data bit */

    #define LCR_STB  0x04 /* Stop bit control */

    #define ONE_STOP 0x00 /* One stop bit! */

    #define LCR_PEN  0x08 /* Parity Enable */

    #define PARITY_NONE 0x00

    #define LCR_EPS  0x10 /* Even Parity Select */

    #define LCR_SP  0x20 /* Force Parity */

    #define LCR_SBRK 0x40 /* Start Break */

    #define LCR_DLAB 0x80 /* Divisor Latch Access Bit */

    定义寄存器相应位的值另一种方法

    #define CHAR_LEN_5 0<<0

    #define CHAR_LEN_6 1<<0

    #define CHAR_LEN_7 1<<1

    #define CHAR_LEN_8 (1<<0)|(1<<1)    /* 8 data bit */

    #define LCR_STB  1<<2 /* Stop bit control */

    #define ONE_STOP 0<<2 /* One stop bit! */

    #define LCR_PEN  1<<3 /* Parity Enable */

    #define PARITY_NONE 0<<3

    #define LCR_EPS  1<<4 /* Even Parity Select */

    #define LCR_SP  1<<5 /* Force Parity */

    #define LCR_SBRK 1<<6 /* Start Break */

    #define LCR_DLAB 1<<7 /* Divisor Latch Access Bit */

    对寄存器操作只需对相应位或赋值

    UART_LCR = CHAR_LEN_8 | ONE_STOP | PARITY_NONE;    /* 设置 8位数据位,1位停止位,无校验位 */

    4 对寄存器某一位置位与清零

    对某一寄存器第7位置位

    XX_CRTL |= 1<<7;

    XX_CRTL &= ~(1<<7);

    UART_LCR |= LCR_DLAB;           /* 时钟分频器锁存使能 */

    UART_LCR &= ~(LCR_DLAB);        /* 禁止时钟分频器锁存 */

    5 判断寄存器某一位是否置位或为0的方法

    #define UART_LSR *(volatile unsigned char *)(UART_BASE_ADRS + 5)  /* 线状态寄存器 */

    #define LSR_DR  1<<0 /* Data Ready */

    当UART_LSR的第0位为1时结束循环

    while (!(UART_LSR & LSR_DR)) /* 等待数据接收完 */

    展开全文
  • } 虽然这是没有意义,因为你不知道ebx寄存器是什么。 如果你把这两个,用gcc -ffixed-ebx编译, #include register int counter asm("ebx"); void check(int n) { if (!(n % 2 && n % 3 && n % 5)) counter++; } ...

    -ffixed-reg

    Treat the register named reg as a fixed register; generated code should never refer to it (except perhaps as a stack pointer, frame pointer or in some other fixed role).

    这可以用更简单的方式复制理查德的答案,

    int main() {

    register int i asm("ebx");

    return i + 1;

    }

    虽然这是没有意义,因为你不知道ebx寄存器是什么。

    如果你把这两个,用gcc -ffixed-ebx编译,

    #include

    register int counter asm("ebx");

    void check(int n) {

    if (!(n % 2 && n % 3 && n % 5)) counter++;

    }

    int main() {

    int i;

    counter = 0;

    for (i = 1; i <= 100; i++) check(i);

    printf("%d Hamming numbers between 1 and 100\n", counter);

    return 0;

    }

    您可以确保C变量始终使用驻留在寄存器中以实现快速访问,并且不会被其他生成的代码覆盖。 (Handy,ebx是通常的x86调用约定下的被调用者,所以即使它被调用其他函数编译没有-ffixed- *,它应该被恢复)。

    另一方面,这肯定是不可移植的,通常也不是一个性能优势,因为你限制了编译器的自由。

    展开全文
  • C语言-寄存器和内存

    千次阅读 2010-11-12 17:05:00
    寄存器是CPU内部重要的数据存储资源,主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间,也就是说CPU操作寄存器比操作内存快(寄存器是直接存取,而内存是寻址存取)。...

    寄存器是CPU内部重要的数据存储资源,主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间,也就是说CPU操作寄存器比操作内存快(寄存器是直接存取,而内存是寻址存取)。

    汇编比C语言效率高,经常操作寄存器也是一个原因吧。

     

    C语言可以把变量定义为寄存器类型的,将数据直接存放在CPU的寄存器中,使用关键字register定义变量

    例如register a=123;定义a为寄存器类型变量。

     

    对于register变量需要注意的几点:

    (1)使用register定义的变量尽可能存放到寄存器中,但不绝对。

    (2)定义的变量一般整数(int)为宜。

    (3)定义的变量,只要涉及到该变量的地址时,编译器都会报错,如"&a",数组首地址a。

    (4)也可以定义指针类型的变量,如register *ptr=&c,c="abcde",c不是register变量。*ptr='a',ptr++移动4个字节。

    (5)不能使用sizeof(register)。

    展开全文
  • #define GPFDAT (*(volatile unsigned long*)0x56000000)分析解释;...(优化了后可能是把该变量的值存放在某个临时的寄存器中,要用时,直接到寄存器读取,因为寄存器读取数据比内存中要快很多)。
    现在随意假设个宏定义寄存器地址:
    #define GPFDAT  (*(volatile unsigned long*)0x56000000)
    先假设:
    unsigned long tmp;定义个无符号长整型变量 
    unsigned long* GPFDAT_PRT = &tmp;定义个无符号长整型指针
    所以现在GPFDAT是存放了地址的指针。同理得:
    把0x56000000转换为地址:(volatile unsigned long*)0x56000000,强制转换。
    所以0x56000000这个地址中的内容应该为:(*(volatile unsigned long*)0x56000000)。
    最后得:GPFDAT这个宏定义代表了某寄存器中的值。

    volatile关键字:
    别称易失变量:容易丢失的变量;因为编译器为了程序的效率,在编译时会进行一些优化。可有时候我们不希望对某些变量进行优化,所以在变量前加上个volatile关键字,编译器就不会对该变量进行优化了,而是老老实实到内存中再去读取数据。(优化了后可能是把该变量的值存放在某个临时的寄存器中,要用时,直接到寄存器中读取,因为寄存器读取数据比内存中要快很多)。
    例:多线程中,一个线程在等另一个线程释放资源时,这个线程会有个while(flag == 0)循环来不断的查看资源是否被释放;而当另个线程把资源释放后会马上修改flag的值,相当于通知等待线程,资源已经释放。这样就不会陷入死锁状态。如果flag变量不用volatile关键字来修饰,将一直读取临时寄存器中的值,而将陷入死锁状态。
    展开全文
  • 在Android手机中通过i2c读取芯片寄存器(含i2c-tools)tags: Android Linux i2c driver需求:同事甩来一个某品牌的手机,Android系统,需要把里面某个芯片的寄存器配置参数值读出来。折腾了两天(坑爹的网络以及...
  • 读取arm mpu的MIDR寄存器

    万次阅读 2013-08-01 15:45:16
    使用如下命令可以读取...在c语言中可以使用如下语句把midr寄存器的值读取到变量i中: asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (i)); 然后返回i即可,根据该寄存器的值可以识别mpu的版本。   midr寄存器的定义如下:
  • (2)加密过程:生成31位序列后,读取待加密文本的每一个字符,和0XFF相与得到8位01串,依次与31位序列按位异或,结果得到8位01串,得到密文,写入ciphertext.txt。 (3)解密过程:每次读入ciphertext.txt中的8个...
  • C程序:枚举并读取PCI device 寄存器值(含exe文件),利用C语言实现编写源程序,访问PCI内存空间很好的学习资料。
  • AM335X是基于Cortex-A8内核的,Am335x自身是不带时钟计数寄存器的,但Cortex-A8有这个寄存器,但需要汇编代码才能读取,本代码中,是使用GCC编译环境的c语言代码内嵌汇编,如果是keil环境的话对汇编的调用可能要稍作...
  • C语言volatile的用法

    2018-08-28 14:27:53
    volatile修饰的变量表明是随时改变的,程序执行时不要进行编译优化,既每次都从变量的地址中读取数据(作用与const相反),不要读取寄存器中的备份。因为访问寄存器的速度要快过SRAM(内存),编译器一般都会做减少存取...
  • C语言的输入输出

    2019-02-21 21:49:29
    scanf:C语言中的格式化输入 例:scanf(&quot;%d&quot;,&amp;amp;A); 可以改变双引号中的%d来改变输入类型 ...gets:C语言中字符数组...getchar:逐个读取寄存器中的每一个字符直到遇到结束符号 输出函数 pr...
  • 如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写...
  • 它的作用是:优化器在使用该关键字定义的变量时,直接从内存中读取原始的数据,而不是读取寄存器里保存的备份的值。 (2)常见用途: ( a)一个中断服务子程序会被访问到的非自动变量。 ( b)多线程应用中被几个任务共享的...
  • C语言之volatile

    2020-07-28 10:41:01
    C语言之volatile emOsprey 鱼鹰谈单片机2月21日 ...当然还有其它寄存器也是如此,比如各种状态寄存器、定时计数器等,他们的改变是靠硬件来改变的,你的程序只能读取数据,所以一定要申明为 volati...
  • #include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字sbit SCLK=P1^0; //位定义1302芯片的接口,时钟输出端口定义在P...
  • C语言volatile

    2017-10-13 08:52:00
    原文地址: ... volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或...如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程...
  • volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的...如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
  • C语言关键字

    2015-11-15 22:33:59
    精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子...
  • 学号201212301118 汇编语言的过程调用如果需要传递参数一般有2种方法通过寄存器来传递或是通过参数来传递还有将所有参数制成参数列表并压栈的...后再调用过程过程再直接读取这些寄存器的内容可想而知此法犹如C语言
  • 编译器在把C语言程序编译成汇编语言时,会对程序进行优化,频繁用到的变量可能会直接存储在寄存器中,下次直接来寄存器读值,但是嵌入式环境下,某个内存地址的值是很容易被中断、多线程等因素修改的,当读取这样的...
  • C语言_关键字

    2020-07-12 17:31:48
    1.static 局部变量: 堆栈变到数据区; 函数: 只有一个备份; 2.volatile 不进行编译或者运行优化; 每次运行从内存中读取数据,不使用寄存器中值。
  • BM8563时钟芯片 51单片机C语言,IIC接口驱动程序,程序包括IIC驱动 void Start_I2C(void) , void Stop_I2C(void) ,void Ack_I2C(bit a) , 从 BM8563 的内部寄存器(时间、状态、报警等寄存器读取数据 bit GetBM...
  • C语言——指针

    2020-04-04 22:06:24
    如i+j 其含义是:根据变量名对应的地址,读取 i 的数据放入到CPU寄存器中,再找到 j 的地址,读取 j 的数据放入到CPU另一个寄存器中,通过CPU的加法中断计算结果。 指针变量 形式:类型说明 *变量名; 定义与赋值 ...
  • 一个定义为volatile的变量会被意想不到的改变,这样编译器就不会假设这个变量的值了,精确的来说就是编译器在用到这个变量的时候必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份;...
  • 嵌入式C语言学习笔记

    2020-09-10 15:45:07
    读取某一个引脚输入的值 在对应的寄存器读取某一比特的值是0 还是 1 在他的配置里头根据功能打开时钟,设置使用的复用功能,我们要给某一位置1或者置0 在嵌入式中,把某一比特某几个比特置0或者清零,把某几个比特...
  • C语言中关键字

    2019-03-03 00:06:24
    精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子...
  • 嵌入式与C语言

    2015-01-08 22:03:07
    C语言中用volatile的关键字声明变量,就是说这个变量会发生意想不到的变化,每次用这个值的时候都需要重新去读取. 精确的讲应该是优化器用这个变量的时候每次都需要重新去读取这个值,而不能用保存在寄存器里的...
  • 首先看一段C51程序:Keil在优化级别是为8时得到如下汇编代码(部分未列出):可以看到,变量d的值赋给x,y,z时,只有x中是直接读取的d中数值,而y=d,z=d则直接将寄存器中的数值赋给y,z。若在此过程中,变量d的值被...
  • 告诉编译器不要去优化volatile修饰的代码,并且每次直接从数据源头读取数据,不允许将数据缓存到寄存器。 注意:对volatile变量的操作不是原子性的。 注意:volatile在c语言中和在java语言中的含义是不同的,本文...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 329
精华内容 131
关键字:

c语言读取寄存器

c语言 订阅