【笔试】CVTE视源2019秋招补录嵌入式岗位面经

文章目录

  • 01 - 笔试内容
  • 02 - 总结


返回导页:导页

01 - 笔试内容

编程题小白选择用纯C语言编程,所以什么都得自己做,除了基础库,没有引用其它库,数值转换要注意边界问题,也就是最大最少值也要转换成功,链表题注意指针指向问题

不定项选择题,答案可能有多个,谨慎选择
1.一个32位数据类型的数0x1234567,以小端模式,存储到0x2001~0x2004地址中,在地址Ox2002上存储的数值是

  • 0x45
  • 0x23
  • 0x34
  • 0x56

2.使用GCC编评器,在32位平台中,有如下定义的结构体:
struct Astruct{
char a;
char b;
int c;
}attribute_((packed));
请问sizeof(struct Astruct)为多少

  • 7
  • 8
  • 6
  • 5

3.关键词virtual不能用干修饰

  • 构造函数
  • 成员函数
  • 析构函数

4.c++的虚函数表有多少个?

  • 所有类的对象实例共用一个
  • 每个类有一个
  • 每个对象实例有一个
  • 整个程序共用一个

5.C语言中,malloc函数申请到的空间存储在哪个位置

  • bss段
  • 栈区
  • 堆区
  • data段

6.预防死锁的编程原则正确的有

  • 在持有锁的临界区调用用户提供的代码
  • 使用固定顺序加锁
  • 使用层次锁
  • 避免嵌套锁

7.一个频率为2000Hz的方波,占空比为40%,一个周期内低电平的宽度为

  • 200us
  • 800ms
  • 300us
  • 200ms

8.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是

  • int((int*)[10])*p
  • 其他所有选项都不正确
  • (int *p[10])(int*)
  • int (*(*p)[10])(*int*)
  • int [10]*p(int*)

9.指针和引用的说法,以下正确的是

  • 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,而指针在任何时候都可以改变为指向另一个对象
  • 引用的创建不会调用类的烤贝构造函数
  • 引用在创建的同时必须初始化,而指针在定义的时候不必初始化
  • 不存在NULL引用,而指针则可以是NULL

10.下列哪些STL容器通常是由红黑树实现的?

  • deque
  • unordered_map
  • map
  • set

11.使用gcc test.c -o test命令生成的文件是

  • 编译后的汇编代码文件
  • 编译后的目标文件
  • 可执行程序
  • 预处理后的C源代码文件

12.在单循环的嵌入式系统中,使用一个全局恋量在中断函数和main函数之间传递数据,为了避免数据错误,可以采用如下做法()

  • 可可用const修饰此全局变景
  • 可以用volatile修饰此全局变最
  • 可以用static修饰此全局恋量
  • 可以用static const修饰此全局变量

13.关于单例模式和全局变量的描述,正确的是

  • 单例类的构造函效必须为私有
  • 如果单例类从未使用过,那么就不会创建它的对象
  • 单例类的析构函数必须为私有
  • 单例类必须提供一个静态方法以供全局访问

14.以下嵌入式中断,描述正确的是

  • CPU使用率高,不用循环等待
  • 响应速度快
  • 可以强行打断原有程序的执行,从而实现CPU的抢占式调度
  • 中断函数可以添加500ms延时的操作

15.以下语句有赋值作用的是

  • a+1
  • ++a
  • a*=b
  • a++

16.哪个命令用来卸载一个内核模块?

  • rmmod
  • unmod
  • modprobe
  • delmod

17.若要使用进程名来结束进程,应使用()命令

  • ps-d
  • profree
  • psfree
  • kill

18.char str[20]="0123456789”;
int a=strlen(str);
int b=sizeof(str);
a,b的值分别是

  • 10,20
  • 10,4
  • 4,20
  • 4,4

19.对所有用户的变量设置,应当放哪个文件下?

  • /etc/profile
  • /etc/skel/.bashrc
  • ~/bash_profile
  • /etc/bashrc

20.下面哪种写法表示如果cmd1成功执行,则执行cmd2命令?

  • cmd1 || cmd2
  • cmd1 | cmd2
  • cmd1 & cmd2
  • cmd1 && cmd2

编程题,纯编辑器,没有测试环境
21.要求实现下面的函数,自行实现字符串转整数,给定一个字符串表示的10进制整数(大小在int类型的范围内),转换成n进制的整数(2<=N<=36),如果转换失败,函数返回“Error"。
char* radixConvert(const char *num,const int n);
示例输入:“10”,2,调用radixConvert(“10”,2),返回:“1010"

char* radixConvert(const char*num, const int n)
{
    //开辟
    int flag = 1;
    int data = 0;
    int i = 0;
    int t,k;
    char c;
    char *ret = (char*)malloc(sizeof(char)*33);
    memset(ret,0,sizeof(char)*33);
    strcpy(ret,"Error");

    //入口判断
    if(NULL == num || n<2 || n>36)
        return ret;


    //正负判断
    if('-' == num[0])
    {
        flag = -1;
        ++i;
    }

    //转为整数
    while(num[i])
    {
        //合法字符
        if(num[i] >= '0' && num[i] <= '9')
        {
            data = data*10 + (num[i] - '0');
            ++i;
        }
        //非法字符
        else
            return ret;
    }

    //如果是0,特殊处理,直接返回
    if(0 == data)
    {
        ret[0] = '0';
        ret[1] = '\0';
        return ret;
    }

    //如果不为0,计算进制
    i = 0;
    while(data)
    {
        t = data % n;
        if(t < 10)
        {
            //正负判断,用于处理最小值
            if(t >= 0)
                ret[i++] = t + '0';
            else
                ret[i++] = -t + '0';
        }
        else
        {
            ret[i++] = t + 'A' - 10;
        }
        data /= n;
    }

    if(-1 == flag)
    {
        ret[i++] = '-';
    }

    //添加结束标志
    ret[i] = '\0';

    //反转
    k = 0;
    --i;
    while(k<i)
    {
        c = ret[k];
        ret[k] = ret[i];
        ret[i] = c;
        ++k;
        --i;
    }

    return ret;
}

22.电视机提供了喜爱节目功能用于收喜欢观看的节目。在喜爱节目功能中,为了更好的满足用户习惯,我们根据用户播放节目的次数,动态修改喜爱节目的排列顺序。
规则为:
(1)节目每被选播一次加1权重分;
(2)喜爱目列表按权重分由高到低排序;
(3)选播节目时,系统均会调用一次动态排序函数UpdateFavChannel,进行权重分更新和节目重新排序功能。
数据结构如下:
typedef struct_Favchannel
{
int ChannelNo;//节目编号
unsigned int FavPoints;//权重分
struct Favchannel *next;
}FavChannel;
函数名:void UpdateFavChannel(FavChannel*pFavHead,int ChannelNo);pFavHead为指向喜爱节目列表头指针(单向链表,里边的节目已经按从大到小排好序,表头无数据),ChannelNo表示选播的节目编号。

void UpdateFavChannel(FavChannel *pFavHead, int ChannelNo)
{
    if(NULL == pFavHead)
        return ;

    FavChannel* prev = pFavHead;
    FavChannel* curr = pFavHead->next;
    FavChannel* target = pFavHead->next->next;
    int t;
    unsigned int k;

    //寻找target
    while((NULL != target) && (target->ChannelNo != ChannelNo))
        target = target->next;

    //没有则返回
    if(NULL == target)
            return;
    else
    {
        //加权重
        target->FavPoints += 1;

        //如果本来就在列头,特殊处理,不需要排序
        if(target == pFavHead->next)
            return ;
        else
        {
            //开始排序,寻找插入目标
            while((NULL != curr) && (curr->FavPoints >= target->FavPoints))
            {
                prev = curr;
                curr = curr->next;
            }
            //如果找到,而且不是target指针,就交换位置
			//交换两个项的值,无需移动指针
            if(NULL != curr && prev != target)
            {
                t = curr->ChannelNo;
                curr->ChannelNo = target->ChannelNo;
                target->ChannelNo = t;

                k = curr->FavPoints;
                curr->FavPoints = target->FavPoints;
                target->FavPoints = k;
            }
        }
    }
}

02 - 总结

  • 基础知识涉及C、C++、Linux、嵌入式相关、操作系统以及数据结构,需要好好复习
  • 纯编辑器写代码一定要自己用笔纸试验整个过程,没有测试环境,太容易出错

返回导页:导页

你可能感兴趣的:(#,记CVTE2019年秋招补录)