八道题:
第一题:用一个宏定义实现配置 m 的GPIO n 位为1或者0
#define GPIO(n,m,b) ((b) == 0 ? ((n) & ~(1U << (m - 1))) : ((n) | 1U << (m - 1)))
第二题:宏定义得出数组table的长度
#define SIZE(table) (sizeof(table)/sizeof(table[0]))
第三题:实现函数void uint32_encode(uint32_t value ,uint8_t * p_encoded_data);
把value 按照小端序的方式存放在数组p_encoded_data里
大端模式:高字节保存在内存的低地址
小端模式:高字节保存在内存的高地址
第四题:下列代码求输出结果
#include <stdio.h> void * change(int *a ,int b) { int c = 30; *a = ~(1 << 2); b = 20; return &c; } int main(int argc, char const *argv[]) { int a = 1,b = 2; int * c; c = change(&a,b); printf("0X%x,%d,%d ",a,b,*c); return 0; }
答案:0Xfffffffb,2,30
说明: a本来值为1 ,但是int类型,因为printf用的是 %x 所以可以写成 00000001 左移2位后取反 变成了 FFFFFFFB
b参数没有传进去,仍为2
c的值的地址被return回来了,所以值被赋为30
第五题:RTOS常见线程通信方式有哪些
1、消息邮箱
2、消息队列
3、信号量
4、互斥信号量
第六题:一个按键的驱动,实现单击双击的功能
void TIM3_IRQHandler(void) //TIM3 中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否 { if(key_fall_flag==1)//发生按键按下事件 { if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下 { if(key_holdon_ms <= 2000) { key_holdon_ms++; } else //按键按下到2000ms就判断长按时间成立,生成长按标志 { key_holdon_ms = 0; short_key_flag=0;//清短按键标志 key_long_down = 1;//长按键标志置位 key_fall_flag = 0;//清按键按下标志 } } else //按键抬起 { if(key_holdon_ms>50)//按下时间大于50ms,生成单击标志 { key_holdon_ms=0; short_key_flag=1; key_long_down =0; key_fall_flag=0; //距离上次单击时间在100~500ms之间,则认为发生连击事件 if(keyupCnt>100 && keyupCnt<500) { doubleClick = TRUE; short_key_flag=0; } keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 } else //按键持续时间小于50ms,忽略 { key_holdon_ms=0; short_key_flag=0; long_key_flag=0; key_fall_flag=0; } } } if(keyUpFlag)//单击抬起后,启动计数,计数到500ms keyupCnt++; if(keyupCnt>500) { keyupCnt = 0; keyUpFlag = FALSE; } } TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志 } }
以上代码摘自网络
第七题:设计函数把字符串转换成整型
int atoi(const char *nptr);
#include <stdio.h> #include <stdbool.h> int my_atoi(const char *src) { int s = 0; bool isMinus = false; while(*src == ' ') //跳过空白符 { src++; } if(*src == '+' || *src == '-') { if(*src == '-') { isMinus = true; } src++; } else if(*src < '0' || *src > '9') //如果第一位既不是符号也不是数字,直接返回异常值 { s = 2147483647; return s; } while(*src != '