• 记一次面试


    八道题:

    第一题:用一个宏定义实现配置 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;
     }

    以上代码摘自网路。

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

  • 相关阅读:
    Java 垃圾回收
    位运算符
    VBA中练习ADO:ActiveX Data Object
    使用VB6制作RTD函数
    VBA中使用JavaScript脚本语言解析JSON数据
    VB洗牌算法产生随机数组
    关于VB里判断逻辑的说明
    在VB中动态执行VBS代码,可操控窗体控件
    VB使用API进行RC4加密解密(MD5密钥)
    VB输出数据到EXCEL
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11794758.html
Copyright © 2020-2023  润新知