面试题目积累

题目一:如何配置寄存器
(1)通过手册:
一、找到要操作IO口的基地址
二、找到端口输入寄存器的地址偏移
三、找到输入数据寄存器中具体的端口数据位
(2)操作IO口
一、找到基地址
二、找到偏移地址,主要是以下几个寄存器:
配置时钟使能:------RCC_APB2ENR
端口配置高/低寄存器:CNF位、MODE位  -----GPIOx_CRH/GPIOx_CRH  
端口输出数据寄存器:   ----------GPIOx_ODR

    int main(void)
    {
        unsigned int *pRCC_APB2ENR = (unsigned int *)0x40021018;
        unsigned int *pGPIOB_CRH = (unsigned int *)0x40010c04;
        unsigned int *pGPIOB_ODR = (unsigned int *)0x40010c0c;
        *pRCC_APB2ENR = 0x00000008;
        *pGPIOB_CRH = 0x44444443;
        *pGPIOB_ODR = 0x00000000;
         return 0;             
    }

C语言总是从main函数开始执行。
定义几个指针,指向刚刚看到的地址。对于编译器来说,它并不知道0x40021018代表的是数据还是指针,所以用(unsigned int *)作强制的类型转换,告诉编译器0x40021018是个指针。指针可以理解为地址。操作指针,把这些地址存放的值修改。
最后的return,代表main函数结束。

unsigned int *pGPIOB_IDR = (unsigned int *)0x40010C08;
unsigned char PB3 = *pGPIOB_IDR & 0x8;//取出从右往左数的第4位

总结:
(1)寄存器就是与CPU最直接打交道的存储空间。
(2)每种外设的寄存器都是和总线连接的,总线处理数据的宽度,决定了寄存器的大小,每种寄存器都是有地址范围的,我们可以在数据手册中查看这个基地址,就像是查字典的时候,先查偏旁
(3)根据具体的外设,查看需要配置什么样的寄存器。然后通过数据手册查看它的地址偏移,复位值进行配置。
(4)计算出上面要用到的寄存器地址,赋值个指针,直接操作就行。
(5)寄存器中的寻位写法:
unsigned char PB3 = *pGPIOB_IDR & 0x8;//取出从右往左数的第4位
这里就取出了GPIOB_IDR寄存器的第4位的值。
(6)寄存器中的置1/0的写法:将变量a的第三位置位或者清零。
用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3 (0x1<<3) 
static int a; 
void set_bit3(void)

a |= BIT3; 

void clear_bit3(void) 

a &= ~BIT3; 
}

题目二:.和source 执行命令的区别

./
: ./xxx.sh 此种方式执行shell脚本 只需要有可执行权限

source
: source xxx.sh此种方式用于修改了配置文件,需要立马生效,而不必重启计算机

区别
调用./xxx.sh来执行shell是在一个子shell里运行的,所以执行后,结果并没有反应到父shell里,但是source不同他就是在本shell中执行的,所以能够看到结果。

eg:
#!bin/bash
export aa=11

./1.sh echo aa显示为空 source 1.sh echo aa显示为11

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页