记一次面试

八道题:

第一题:用一个宏定义实现配置 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 != '' && *src >= '0' && *src <= '9')
      {
          s = s * 10 + *src - '0';
          src++;
      }
      return s * (isMinus ? -1 : 1);
 }

 int main()
 {
      int num;
  
      char *str = "a123456";
      num = my_atoi(str);
      printf("atoi num is: %d 
", num);
  
      return 0;
 }

以上代码摘自网路。

第八题:实现一个简单的消息队列,实现接收发送消息(队列本身可以不实现)

原文地址:https://www.cnblogs.com/qifeng1024/p/11794758.html