精华内容
下载资源
问答
  • } 虽然这是没有意义,因为你不知道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- *,它应该被恢复)。

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

    展开全文
  • 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)) /* 等待数据接收完 */

    展开全文
  • android/linux 读取寄存器值
  • c语言常见寄存器操作

    千次阅读 2019-04-24 18:40:55
    1 寄存器地址的定义: #define UART_BASE_ADRS (0x10000000) /* 串口的基地址 */ #define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0) /* 数据接受寄存器 */ #define UART_THR *(volatile ...

    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)) /* 等待数据接收完 */

     

    if (tpreg&(1<<15))    //看tpreg的第15位

    tbuffer = iccurdata ^ ioolddata;//取出改变的io口
    tbufferh = iocurdata & tbuffer;//取出由低变高的io
    tbuffer^=tbufferh;    //取出由高变低的io


    (comm&0x40) &&1;  //comm的bit6位是否为1  

    a=(a&0x0f)^0x0f   //高4位清0,低4位取反  
    a<<4;  //取反的低4位移到高4位

    if(!led)   //led=0
    if(led)  //led=1
    if(!(led_time||led_cnt))   led_time=0且led_cnt=0
    usartxbase |= itmask;//对应位置1
    usartxbase &= ~itmask;//对应位置0


    USART_IT >> 0x08;  //将bit8之后(bit9)的移到低位
    #define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00))
    //判断bit7 bit6是否不同时为0
     

    展开全文
  • C语言寄存器的位操作

    千次阅读 2020-08-30 12:18:36
    C语言位操作 1、位操作符 (1)位与& 逻辑与&& 1&1=1 1&0=0 0&0=0 0&1=0 (2)位或 | 逻辑或 || 1 | 1=1 1 | 0=1 0 | 0=0 0 | 1=1 (3)位取反~ 逻辑取反 ! (4)位...

    C语言位操作

    1、位操作符

    (1)位与& 逻辑与&& 1&1=1 1&0=0 0&0=0 0&1=0

    (2)位或 | 逻辑或 || 1 | 1=1 1 | 0=1 0 | 0=0 0 | 1=1

    (3)位取反~ 逻辑取反 !

    (4)位异或 ^ 不同为1,相同为0 1^1=0 1^0=1 0^0=0 0^1=1

    总结:

    • 位操作是按照二进制数的每一位进行操作的,逻辑操作是对数的整体操作的
    • 位与,与1位与无变化,与0位与为0
    • 位或,与1位或为1,与0位或无变化
    • 位异或,与1位异或会取反,与0位异或无变化

    (5)移位操作

    • C语言的移位要取决于数据类型

    • 左移位 << 右移位 >>

      • 无符号数, 逻辑移位

        左移位时右侧补0

        右移位时左侧补0

      • 有符号数, 算数移位

        左移位时右侧补0(相当于逻辑移位)

        右移位时左侧补符号位,如果是正数就补0,负数就补1(第一位为符号位,0为正,1为负)

    2、位操作符在操作寄存器时的特殊作用

    (1)寄存器的操作要求

    • ARM是内存和IO统一编址的,CPU通过向内部外设的寄存器写入特定值来操作内部外设
      • 寄存器特点:按位进行规划和使用、读写是32位整体进行操作的
    • 寄存器的操作要求:操作寄存器时,要求改变某一特定位,而不影响其他位
    • 如何实现:读出—>改相应位—>写入

    (2)改相应位的操作

    ​ 基本思路:寄存器特定位改变而不影响其他位,构造合适的1和0组成的数和这个寄存器原来的值位与、位或、位取反

    • 特定位清零用 & (用0清零)

      • 与1位与无变化、与0位与变为0

      • 要清零的位为0,其他位为1,然后这个数与原数位与

      • 举例:原32位寄存器的值位0xAAAAAAAA,对bit2~bit8清零

        ​ 0xAAAAAAAA & 0xFFFFFE03

    • 特定位置1用 | (用1置1)

      • 与1位或为1,与0位或无变化

      • 要置1的位为1,其他位为0,然后这个数与原数位或

      • 举例:原32位寄存器的值位0xAAAAAAAA,对bit8~bit15置1

        ​ 0xAAAAAAAA | 0x0000FF00

    • 特定位取反用^ (用1取反)

      • 与1位异或为会取反,与0位异或无变化

      • 要取反的位为1,其他位为0,然后这个数与原数位异或

      • 举例:原32位寄存器的值位0xAAAAAAAA,对bit8~bit15取反

        ​ 0xAAAAAAAA ^ 0x0000FF00

    • 代码举例

      unsigned int a = 0xa12aaaa7;
      unsigned int b = 0xFFFF00FF;
      unsigned int c;
      c = a & b;
      // 16进制数的打印
      printf("a & b = %#X.\n", c);
      printf("a & b = 0x%x.\n", c);
      

    3、使用位运算构建特殊二进制数

    (1)使用位移获取特定位为1的二进制数

    • 获取bit3-bit7为1,同时bit23-bit25为1,其余都为0的数
      • (0x1F<<3) | (0x7<<23)

    (2)使用位移获取特定位为0的二进制数

    • 获取bit4-bit10为0,其余都为1的数
      • bit4-bit10为0也就是bit0-bit3为1同时bit11-bit31为1
        (0xF<<0) | (0x1FFFFF<<11)
      • ~(0x7F<<4)

    (3)总结

    • 1少0多,连续多个1左移n位
    • 0少1多,先构建其位反数,再按位取反
    • 连续1(0)不止一个,则通过分段分别构建,再彼此位与即可

    4、位运算的操作实战

    ​ 回顾:清零用&,置1用 | ,取反用^

    ​ ~和<< >>用来构建特定二进制数

    unsigned int a ; // 定义无符号数,如果是有符号数,那么位移就会出问题

    (1)给定一个整型数a,设置a的bit3,保证其他位不变

    • a |= (0x1<<3)

    (2)给定一个整型数a,设置a的bit3-bit7,保证其他位不变

    • a |= (0x1F<<3) a |= (0b11111<<3)

    (3)给定一个整型数a,清除a的bit15,保证其他位不变

    • a &= (~(0x1<<15)) a = (a | (0x7FFF<<0) | (a | (0xFFFF<<16) (不采用)

    (4)给定一个整型数a,清除a的bit15-bit23,保证其他位不变

    • a &= (~(0x1FF<<15))

    (5)给定一个整型数a,取出a的bit3-bit8

    • 先将a的bit3-bit8不变,其余位清零
      • a &= (0x3F<<3)
    • 再将a右移3位
      • a >>= 3

    (6)给寄存器的bit7-bit17赋值937,其余位不受影响

    • 先将bit7-bit17全部清零,其他位不变
      • a &= (~(0x7FF<<7))
    • 再将937写入bit7-bit17,其他位不变
      • a |= (937<<7)

    (7)将寄存器bit7-bit17中的值加17,其余位不受影响

    • 先读出bit7-bit17的值
      • temp = a & (0x7FF<<7)
      • temp >>= 7;
    • 给temp加17
      • temp += 17
    • 将bit7-bit17清零
      • a &= (~(0x7FF<<7))
    • 将temp算出的值写入到bit7-bit17
      • a |= (temp<<7)

    (8)给寄存器bit7-bit17赋值937,同时给bit21-bit25赋值17

    • 先将bit7-bit17和bit21-bit25清零,其他位不变
      • a &= (~ ( (0x7ff<<7) | (0x1f<<21) ) ) // 位或优先级高于~
    • 再将937赋值到bit7-bit17,17赋值到bit21-bit25
      • a |= ((937<<7) | (17<<21))

    printf(“a = %u.\n”, a); // %u 打印无符号数

    5、技术升级:使用宏定义来完成运算

    (1)直接用宏定义来置位、复位(最右边是第一位,bit0)

    // 置位
    #define SET_NTH_BIT(x, n)	(x | ( (1U) << (n-1) )  )
    // 复位
    #define CLEAR_NTH_BIT(x, n)	(x & ~ ( (1U) << (n-1) )  )
    // 1后边的U表示这个数字是无符号数(有符号数的右移是会出问题的)
    

    (2)将32位数x的第n位到第m位置位

    // 关键点:我们需要一个算式来得到(m-n+1)个1的十六进制数
    // 第1步,先得到32个1: ~0U	(~按位取反得到32个1,如果直接1U那么就只有bit0位1)
    // 第2步,将得到的数右移x位即可得到(m-n+1)个: (~0U) >> (32-(m-n+1)) 或 ~(~0U<<(m-n+1))
    #define SET_BIT_N_M(x, n, m)	(x | (((~0U) >> (32-(m-n+1))) << (n-1)))
    #define SET_BIT_N_M(x, n, m)	(x | ~(~0U<<(m-n+1))<<(n-1))
    

    (3)截取变量的部分连续位(相当于4中的(5))

    // 给定一个整型数a,取出a的bit3-bit8
    //   先将a的bit3-bit8不变,其余位清零	    a &= (0x3F<<3)
    //   再将a右移3位					   a >>= 3
    #define GETBITS(x, n, m)	(x & ~(~0U << (m-n+1)) << (n-1)) >> (n-1))
    // 思路:
    // 	先将x的bit(n-1)-bit(m-1)不变,其余位清零
    //		得到(m-n+1)个1的十六进制数    ~(~0U << (m-n+1))                (得到0x3F)
    //		将得到的16进制数左移(n-1)     ~(~0U << (m-n+1)) << (n-1)       (得到0x3F<<3)
    // 		x和左移后的数位与             x & ~(~0U << (m-n+1)) << (n-1)   (a &= (0x3F<<3))
    // 	再将x右移(n-1)位
    // 		位与后的数右移(n-1)		  (x & ~(~0U << (m-n+1)) << (n-1)) >> (n-1)
    // 最终结果
    #define GETBITS(x, n, m)	(x & ~(~0U << (m-n+1)) << (n-1)) >> (n-1))
    
    // 得到(m-n+1)个1的十六进制数的两种方式:
    // 		32位的1先左移(m-n+1)位,那么低(m-n+1)位位0,高(32-(m-n+1))位为1,再将其按位取反,
    // 						   就得到低(m-n+1)位为1,高(32-(m-n+1))位为0。
    				~(~0U << (m-n+1))
    // 		有(m-n+1)个1,那么就有32-(m-n+1)个0,将32位的1先右移32-(m-n+1),
    // 							那么高32-(m-n+1)位为0,低(m-n+1)位为1。
    				(~0U) >> (32-(m-n+1))
    
    展开全文
  • C语言-寄存器和内存

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

    万次阅读 2011-04-30 19:57:00
    1 寄存器地址的定义: #define UART_BASE_ADRS (0x10000000) /* 串口的基地址 */ #define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0) /* 数据接受寄存器 */ #define UART_THR *(volatile ...
  • 文章来自http://book.51cto.com/art/201012/237939.htm,个人意见:C语言结构体位域操作寄存器仅供参考,能不用则不用~1.2.3 添加位域结构体1)增加位域定义我们经常需要直接访问寄存器中的某个位域。C281x C/C++...
  • C程序:枚举并读取PCI device 寄存器值(含exe文件),利用C语言实现编写源程序,访问PCI内存空间很好的学习资料。
  • C语言访问MCU寄存器

    2020-03-23 08:51:21
    C语言访问MCU寄存器 问题由来: //下面这行代码的意思是直接操作0X020C4068这个寄存器 //具体寄存器的作用是通过...//要设置0X020C4068寄存器值为0X03,可以直接写成 CCM_CCGR0=0X03 为什么这个宏定义可以直接操作...
  • CC2541 硬件I2C读取寄存器返回值错误 做的项目需要用到CC2541的硬件I2C功能,使用的是TI的I2C驱动。但是调试时读取不同寄存器的数据全都一样,用示波器监控信号时发现: 读取寄存器地址时发送的从机地址和寄存器地址...
  • AM335X是基于Cortex-A8内核的,Am335x自身是不带...该寄存器值可以作为一个随机数来用,代码里面附有使用说明。并附上Cortex-A8 Technical Reference Manual(Cortex-A8技术参考手册),如有更好的方式,可以私信交流。
  • 寄存器值: u32RegValue = *((uint32 volatile *)(reg_addres)); 写寄存器值: *((uint32 volatile *)(reg_addres)) = value;
  • 在某些场景下我们需要读取系统相关寄存器,我们往往需要读取出来之后去操作相应的bit得到我们需要的信息。这里可以使用union来直接获取你需要的信息。直接看code实现: 不失一般性,这里假设某一32位寄存器bit...
  • C语言访问MCU寄存器的三种方式

    千次阅读 2015-09-03 14:09:15
    C语言访问MCU寄存器的三种方式 MCU中的特殊功能寄存器SFR,实际上就是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有3种方法。
  • #define GPFDAT (*(volatile unsigned long*)0x56000000)分析解释;...(优化了后可能是把该变量的存放在某个临时的寄存器中,要用时,直接到寄存器读取,因为寄存器读取数据比内存中要快很多)。
  • ARM寄存器的地址类似于内存地址(IO与内存统一编址的),所以这里的问题是用C语言读写寄存器,就是用C语言来读写内存地址。用C语言来访问内存,就要用到指针:例如某寄存器的地址为0xE0200240; define GPJ0CON 0xE...
  • 近期学习,需要打印字符,以及读取寄存器(Register)的内容,并输出到dos窗口下显示,C+Assembly实现很简单,但是,纯汇编实现就比较复杂了。由于个人能力有限,自己不会写,就在网上找到了可用的Demo,下面,我把这...
  • 讲述如何使用C语言来对底层寄存器进行封装 内容: 存储器映射 寄存器寄存器映射 C语言访问寄存器 存储器映射 程序存储器、数据存储器、寄存器和I/O 端口排列在同一个顺序的4 GB 地址空间内 存储器...
  • c语言fread读取重复

    千次阅读 2014-05-20 16:48:26
    用fread读取一个txt文件,老是在末尾处有一部分会重复读
  • 1引言 支持C语言几乎是所有微控制器程序设计的一项基本要求,当然SPMC75系列单片机也不例外。μ'nSPTM 指令结构的设计就着重考虑对C语言的支持,GCC就是一种针对μ'nSPTM 操作平台的ANSI-C编译器。但是在应用中...
  • C语言如何实现读写SOC中的寄存器

    千次阅读 2019-08-31 17:42:33
    C语言如何实现读写SOC中的寄存器 SOC、MCU、MPU等处理芯片,芯片内部有大量的寄存器,为了实现对应的功能,需要操作寄存器。对于汇编语言,可以使用汇编指令操作寄存器,同样,C语言也具备操作寄存器能力。 一、...
  • https://ilinuxkernel.com/?p=255
  • 在Android手机中通过i2c读取芯片寄存器(含i2c-tools)tags: Android Linux i2c driver需求:同事甩来一个某品牌的手机,Android系统,需要把里面某个芯片的寄存器配置参数读出来。折腾了两天(坑爹的网络以及...
  • 数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。这里要说明的一点是:小太监是主动的从大臣手里接过奏章,然后主动的...
  • keil c中获得arm的sp寄存器值

    千次阅读 2010-08-20 12:01:00
    __asm int return_sp(){ MOV r0, sp BX LR}
  • 读取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寄存器的定义如下:
  • PC读写西门子PLC寄存器

    万次阅读 多人点赞 2018-08-20 16:27:08
    西门子PLC调试助手工具适用于西门子S7-300、S7-400、S7-1200、S7-1500等具备Ethernet TCP/IP通讯方式的PLC的(I、M、Q、DB区)寄存器值的读写,采用的是102端口网络通讯方式,方便西门子PLC软硬件开发工程师的测试,...
  • C语言位操作在寄存器中的应用 本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。 整体思想: 设置一个位就是设置该位为1,清除就是设置该位为0 寄存器操作的要求:特定位改变而不影响...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,805
精华内容 13,122
关键字:

c语言读取寄存器的值

c语言 订阅