嵌入式相关4

时间:2023-01-21 14:41:30

 

 

 

/************************

Chapter3 系统类

***********************/

1. Rtx51 Tiny是如何实现任务调度,切换的?

时间片轮转,每个任务执行一定的时间退出执行下个任务如此循环。一个时间片内任务可以通过调用系统函数结束自身的执行转去执行下个任务。任务执行超过一个时间片系统强制终止该任务的执行转去执行下个任务。

 

2. Small Rtos51是如何实现任务调度,切换的?

完全基于有优先级的抢占式操作系统。任务切换有两种情况:1当前任务自己放弃cpu时间; 2中断程序使优先级更高的任务就绪,所有中断退出后进行任务切换。

 

3. Uc/os是如何实现任务调度,切换的?

完全基于有优先级的抢占式操作系统。任务切换有两种情况:1当前任务自己放弃cpu时间; 2中断程序使优先级更高的任务就绪,所有中断退出后进行任务切换。任务切换的过程大致是当前任务上下文入栈,最高优先级任务上下文出栈。

 

 

 

4.Linux是如何实现任务调度的?

Linux既有时间片又有高优先级抢占。时间片到强制任务调度。时间片内有更高优先级任务就绪任务切换。

 

 

 

 

 

 

 

  1. 编译工具的解释

答:arm-linux-ld:用于将多个目标文件、库文件连接成可执行文件。-T选项可以直接使用它来指定代码段、数据段、bss段的起始地址,也可以用来指定一个连接脚步,在连接脚本中进行更复杂的地址设置。如:

arm-linux-ld –Ttext 0x00000000 link.o –o link_elf_0x30000000

arm-linux-ojcopy:被用来复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。

在编译b ootloader,内核时,常用arm-linux-objcopy命令将ELF格式的生成结果转换为二进制文件,如:

arm-linux-objcopy –O binary –S elf_file bin_file

arm-linux-objdump:用于显示二进制文件信息,常用来查看反汇编代码。如:

arm-linux-objdump –D elf_file > dis_file

grep:搜索,如:

grep "request" * -R *表示查找当前目录下的所有文件、目录,-R表示递归查找子目录。

diff命令常用来比较文件、目录,也可以用来制定补丁文件。如:

diff –urNwB linux-2.6.22 linux-2.6.22_ok > linux-2.6.22.diff

-u:表示在比较结果中输出上下文中一些相同的行,这有利于人工定位。

-r:表示递归比较各个子目录下的文件

-N:将不存在的文件当做空文件

-w:忽略对空格的比较

-B:忽略对空行的比较。

2.makefile

hello:hello.c

    gcc –o hello hello.c

clean:

    rm –f hello

make命令根据文件的更新时间戳来决定哪些文件需要重新编译,这使得可以避免编译已经编译过的,没有变化的程序,可以大大提高效率。

决定编译哪些文件?

怎样编译这些文件?

怎样连接这些文件,最重要的是它们的顺序如何?

3.cache的作用

基于程序访问的局部性,在主存和cpu通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供cpu在一段时间内使用,这对提高程序的运行速度有很大的作用。

启用cache后,cpu读取数据时,如果cache中有这个数据的副本则直接返回,否则从主存中读入数据,并存入cache中,下次再读写这个数据时,可以直接使用cache中的副本。

写数据时,有写回式 write back和写穿式write through。

4、LCD的驱动

#define VBPD     (14)     //垂直同步信号的后肩
#define VFPD     (11)     //垂直同步信号的前肩
#define VSPW     (2)     //垂直同步信号的脉宽

#define HBPD     (37)    //水平同步信号的后肩
#define HFPD     (19)     //水平同步信号的前肩
#define HSPW     (29)    //水平同步信号的脉宽

主要设置这些时间参数,经过这些像素的无效数据后,第一个有效像素才出现。

frame_buffer驱动程序初始化函数的流程:

开始

获取架构相关的一些信息,mach_info = pdev->dev.platform_data:

初始化fb_info结构,其中用到了mach_info的一些内容

注册中断处理函数

使能LCD控制器的时钟

初始化frame_buffer的内存

初始化

5、uboot移植

a),系统时钟的设置,2440的FCLK为400MHz,分频率为fclk:hclk:pclk=1:4:8,upll=48MHz,uclk=48MHz,

分别为fclk:内核时钟,主频。

hclk:总线时钟

pclk:I/O接口时钟。

设置串口波特率时需要获得系统时钟。

a),设置机器码,168.

a),选择nor flash型号,配置一个flash文件。

支持串口xmodem协议,使用U_BOOT_CMD宏来增加loadx命令:主要是一个do_load_serial_bin的函数和load_serial_xmodem函数。

a),支持烧写yaffs文件系统的映像。cmd_nand.c,0-》1

 

6.移植linux内核

1、makefile和kconfig文件分析

2、在移植linux之前,先了解它的启动过程。主要分两部分:

⑴、arch/arm/kernel/head.S是内核执行的第一个文件,架构/开发板相关的引导过程:首先检查内核是否支持当前架构的处理器,然后检查是否支持当前开发板。

接下来为调用start_kernel作准备:连接内核时使用虚拟地址,要设置页表,使能MMU。

复制数据段,清除代码段,设置栈指针,保存cpu的ID,调用start_kernel函数。

⑵、/init/main.c,进行内核的初始化的全部工作,输出linux的版本信息,设置于体系结构相关的环境:setup_arch,初始化控制台:console_init,最后调用rest_init函数启动init过程,创建第一个进程init,

 

 

7、文件系统

为了在安装软件时能够预知文件、目录的存放位置,为了让用户方便的找到不同类型的文件,所以需要构建文件系统。内核映像文件、内核启动后运行的第一个程序,给用户提高操作界面的shell程序、应用程序所依赖的库等。这些必需、基本的文件合成根文件系统。

 

 

 

 

 

 

C/C++面试题大汇总之微软亚洲技术中心面试题

1.进程和线程的差别。

2.测试方法

3.Heap与stack的差别。

4.Windows下的内存是如何管理的?

5.介绍.Net和.Net的安全性。

6.客户端如何访问.Net组件实现Web Service?

7.C/C++编译器中虚表是如何完成的?

8.谈谈COM的线程模型。然后讨论进程内/外组件的差别。

9.谈谈IA32下的分页机制

10.给两个变量,如何找出一个带环单链表中是什么地方出现环的?

11.在IA32中一共有多少种办法从用户态跳到内核态?

12.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?

13.如何截取键盘的响应,让所有的'a'变成'b'?

14.Apartment在COM中有什么用?为什么要引入?

15.存储过程是什么?有什么用?有什么优点?

16.Template有什么特点?什么时候用?

17.谈谈Windows DNA结构的特点和优点。

18.网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、将一个字符串逆序

2、将一个链表逆序

3、计算一个字节里(byte)里面有多少bit被置1

4、搜索给定的字节(byte)

5、在一个字符串中找到可能的最长的子字符串

6、字符串转换为整数

7、整数转换为字符串

威盛

1.什么是平衡二叉树?编写一个删除平衡二叉树的程序?

2.写一个程序,求有向有权图两点之间的最小权?

3.根据你的理解,写出Cstring类的构造函数和析构函数?

4.使用C语言实现对ini文件的访问,使程序可以对int,double,字符串类进行读写。

5.n×n个方格(n为任意整数),定义若两个格有公共边则称两个格相邻。现将 个格中的N个格子图黑,使每个格子都与黑格子相邻。试编程,使N最小。

1.static变量和static 函数各有什么特点?

3.描述一下嵌入式基于ROM的运行方式基于ram的运行方式有什么区别。

4.task 有几种状态?

5.task 有几种通讯方式?

6.C函数允许重入吗?

7.嵌入式操作系统和通用操作系统有什么差别?

一面,技术面

(1)VxWorks、uc/OS、Palm嵌入式系统操作系统的区别?

(2)做嵌入式软件开发和普通桌面软件开发有什么区别?

(3)c语言问题,union和struct 的区别?

(4)sizeof(一大堆变量),如果用这个函数分配内存的大小一定与定义相同吗?

(5)解释什么是优先级反转。

Can structures be passed to the functions by value?

Why cannot arrays be passed by values to functions?

Advantages and disadvantages of using macro and inline functions?

What happens when recursion functions are declared inline?

Scope of static variables?

Difference between object oriented and object based languages?

Multiple inheritance - objects contain howmany multiply inherited ancestor?

What are the 4 different types of inheritance relationship?

How would you find out the no of instance of a class?

Is java a pure object oriented language? Why?

Order of constructor and destructor call in case of multiple inheritance?

Can u have inline virtual functions in a class?

When you inherit a class using private keyword which members of base class are visible to the derived class?

What is the output of printf("\nab\bcd\ref"); -> ef

#define cat(x,y) x##y concatenates x to y. But cat(cat(1,2),3) does not expand but gives preprocessor warning. Why?

Can you have constant volatile variable? Yes, you can have a volatile pointer?

++*ip increments what? it increments what ip points to

Operations involving unsigned and signed – unsigned will be converted to signed

a+++b -> (a++)+b

malloc(sizeof(0)) will return – valid pointer

main() {fork();fork();fork();printf("hello world"); } – will print 8 times.

Array of pts to functions – void (*fptr[10])()

Which way of writing infinite loops is more efficient than others? there are 3ways.

# error – what it does?

How is function itoa() written?

Who to know wether systemuses big endian or little endian format and how to convert among them?

What is interrupt latency?

What is forward reference w.r.t. pointers in c?

How is generic list manipulation function written which accepts elements of any kind?

What is the difference between hard real-time and soft real-time OS?

What is interrupt latency? How can you recuce it?

What is the differnce between embedded systems and the system in which rtos is running?

How can you define a structure with bit field members?

What are the features different in pSOS and vxWorks?

How do you write a function which takes 2 arguments - a byte and a field in the byte and returns the value of the field in that byte?

What are the different storage classes in C?

What are the different qualifiers in C?

What are the different BSD and SVR4 communication mechanisms

一位资深的嵌入式项目经理曾这样对我说:搞嵌入式要往下走,要搞底层要搞算法,因为它们比较有前途。

Embedded firmware interview questions

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、将一个字符串逆序 /*

#include <iostream>

using namespace std;

//#define NULL ((void *)0)

char * mystrrev(char * const dest,const char * const src)

{

if (dest==NULL && src==NULL)

   return NULL;

char *addr = dest;

int val_len = strlen(src);

dest[val_len] = '\0';

int i;

for (i=0; i<val_len; i++)

{

   *(dest+i) = *(src+val_len-i-1); 

}

 

return addr;

 

 

}

main()

{

char *str="asdfa";

char *str1=NULL;

str1 = (char *)malloc(20);

if (str1 == NULL)

   cout<<"malloc failed";

 

cout<<mystrrev(str1,str);

free(str1);

str1=NULL;//杜绝野指针

}

 

 

2、将一个链表逆序

p=head;

q=p->next;

while(q!=NULL)

{

temp=q->next;

q->next=p;

p=q;

q=temp;

}

这样增加个辅助的指针就行乐。

ok 通过编译的代码:

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

 

typedef struct List{

int data;

struct List *next;

}List;

 

List *list_create(void)

{

struct List *head,*tail,*p;

int e;

head=(List *)malloc(sizeof(List));

tail=head;

printf("\nList Create,input numbers(end of 0):");

scanf("%d",&e);

while(e){

p=(List *)malloc(sizeof(List));

p->data=e;

tail->next=p;

tail=p;

scanf("%d",&e);}

 

tail->next=NULL;

return head;

}

 

List *list_reverse(List *head)

{

List *p,*q,*r;

p=head;

q=p->next;

while(q!=NULL)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

 

head->next=NULL;

head=p;

return head;

}

 

void main(void)

{

struct List *head,*p;

int d;

head=list_create();

printf("\n");

for(p=head->next;p;p=p->next)

printf("--%d--",p->data);

 

head=list_reverse(head);

printf("\n");

for(p=head;p->next;p=p->next)

printf("--%d--",p->data);

}

 

 

 

3、计算一个字节里(byte)里面有多少bit被置1

解:此题按步骤解:先定位到某一个BYTE数据;再计算其中有多少个1。叠加得解。

 

#incluede<iostream>

#define N 10

//定义BYTE类型别名

#ifndef BYTE

typedef unsigned char BYTE;

#endif

 

int comb(BYTE b[],int n)

{

int count=0;

int bi,bj;

BYTE cc=1,tt;

 

 

4、搜索给定的字节(byte)

for(bi=0;bi<n;bi++)

{

//计算该BYTE8bit中有多少个1

tt=b[bi];

       for(bj=0;bj<8;bj++)

{

         //1相与或模2结果是否是1?测试当前bit是否为1

         //if(tt%2==1)

       if((tt&cc)==1)

{

            count++;

         }

         //右移一位或除以2,效果相同

//tt=tt>>1;

tt=tt/2;

}

}

return count;

}

//测试

int main()

{

BYTE b[10]={3,3,3,11,1,1,1,1,1,1};

cout<<comb(b,N)<<endl;

return 0;

}

 

 

 

5。编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。

char * search(char *cpSource, char ch)

{

char *cpTemp=NULL, *cpDest=NULL;

int iTemp, iCount=0;

while(*cpSource)

{

if(*cpSource == ch)

{

iTemp = 0;

cpTemp = cpSource;

while(*cpSource == ch)

++iTemp, ++cpSource;

if(iTemp > iCount)

iCount = iTemp, cpDest = cpTemp;

if(!*cpSource)

break;

}

++cpSource;

}

return cpDest;

}

 

6、字符串转换为整数

// 自定义函数MyAtoI

// 实现整数字符串转换为证书输出

// 程序不检查字符串的正确性,请用户在调用前检查

//

#include <stdio.h>

#include <string.h>

int MyAtoI(char str[])

{

int i;

int weight = 1; // 权重

int rtn = 0; // 用作返回

for(i = strlen(str) - 1; i >= 0; i--)

{

   rtn += (str[i] - '0')* weight; //

   weight *= 10; // 增重

}

return rtn;

}

void main()

{

char str[32];

printf("Input a string :");

gets(str);

printf("%d\n", MyAtoI(str));

}

 

 

 

7、整数转换为字符串

#include<stdio.h>

#include<string.h>

void reverse(char s[])

{   //字符串反转

    int c, i=0, j;

    for(j=strlen(s)-1;i<j;j--)

    {    c=s[i];

        s[i]=s[j];

        s[j]=c;

        i++;

    }

}

void IntegerToString(char s[],int n)

{    int i=0,sign;

    if((sign=n)<0)//如果是负数,先转成正数  

        n=-n;

    do //从个位开始变成字符,直到最高位,最后应该反转

    {    s[i++]=n%10+'0';

    }while((n=n/10)>0);

    //如果是负数,补上负号

    if(sign<0)

        s[i++]='-';

    s[i]='\0';//字符串结束

    reverse(s);

}

void main()

{    int m;

    char c[100];

    printf("请输入整数m: ");

    scanf("%d",&m);

    IntegerToString(c,m);

    printf("integer = %d string = %s\n", m, c);

}