嵌入式软件笔试题

2024-04-27 06:20
文章标签 笔试 嵌入式软件

本文主要是介绍嵌入式软件笔试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目1

下面函数是从链表中摘除节点,请补充代码使其完整:

typedef void **list_t;struct list
{struct list *next;
};void list_remove(list_t list,void *item) {struct list *l,*r;if(*list == NULL) {return;}r = NULL;for(l = *list;l!=NULL;l=l->next) {if(l==item) {if(r==NULL) {// 填空1}else {// 填空2}l->next = NULL;return;}r=l;}
}

答案:

void list_remove(list_t list, void *item) {struct list *l, *r;if (*list == NULL) {return;}r = NULL;for (l = *list; l != NULL; l = l->next) {if (l == (struct list *) item) {if (r == NULL) {*list = l->next; // 填空1} else {r->next = l->next; // 填空2}l->next = NULL;return;}r = l;}
}

问题2

在32位CPU上,下面代码能否正常工作,如果能,请写出可能的打印结果。

#include "stdio.h"// 在32位CPU上,下面代码能否正常工作,如果能,请写出可能的打印结果。typedef struct a_struct {char ch;short data;long value;void *buf;
};#define offsetof(type,member)   (&((type *)0)->member)int main(void){printf("%d,%d,%d,%d\r\n",offsetof(struct a_struct ,ch),offsetof(struct a_struct ,data),offsetof(struct a_struct ,value),offsetof(struct a_struct ,buf));// 0 2 4 8 // (&((type *)0)->member)是C语言中用于计算结构体成员在结构体中的偏移量的一种常用技巧。这行代码的含义可以拆解如下:
/* (type *)0: 将0强制转换为指向type类型的指针。在这里,0被解释为一个空指针,然后被转换为指向type类型的指针。因为指针大小在32位平台上通常为4字节,所以这里假设type类型占用的空间大小小于等于4字节。->member: 通过箭头操作符,访问结构体指针所指向的结构体中的成员member。这样做的前提是0处的内存被假设为一个type类型的结构体实例,然后通过该指针访问其中的成员。&: 取得成员member的地址。所以(&((type *)0)->member)实际上是获取了member成员在type类型结构体中的偏移量。这个技巧常用于实现offsetof宏,用来在编译期计算结构体成员的偏移量,而不需要运行时信息。 */
}

问题3

// 下面的程序由任务(线程)A,B,C调用,但他们不能工作,怎么解决这个问题?.

static init __g_counter;os_semaphore_t __g_sem_plus;
os_semaphore_t __g_sem_minus;void counter_increment(int count) {os_semaphore_take(__g_sem_plus);_g_counter += count;
}void counter_decrement(int count) {_g_counter -= count;os_semaphore_give(__g_sem_minus);
}

提供的代码中,存在一些问题可能导致任务A、B和C无法正常工作。主要问题在于信号量(semaphore)的使用有误以及全局变量_g_counter未正确初始化。

解决这个问题,您可以按照以下方式调整代码:

初始化全局计数器 __g_counter:

static int _g_counter = 0;

初始化信号量 __g_sem_plus 和 __g_sem_minus:
在程序开始处添加以下代码:

os_semaphore_create(&__g_sem_plus, 1); // 初始化为可用
os_semaphore_create(&__g_sem_minus, 0); // 初始化为不可用

更正函数定义:
修改 counter_increment 和 counter_decrement 函数如下:

void counter_increment(int count) {os_semaphore_take(__g_sem_plus);_g_counter += count;os_semaphore_give(__g_sem_minus);
}void counter_decrement(int count) {os_semaphore_take(__g_sem_minus);_g_counter -= count;os_semaphore_give(__g_sem_plus);
}

通过以上改动,确保全局变量 _g_counter 被正确初始化,同时修改信号量的使用,使得 counter_increment 和 counter_decrement 函数可以正常工作,避免竞争条件和死锁情况。


问题可能在于多个任务(线程)同时访问共享资源__g_counter,而没有进行合适的同步操作,导致竞态条件(race condition)。在这种情况下,任务A、B、C可能会在不同的时刻同时修改__g_counter,导致不可预测的结果和错误行为。

要解决这个问题,你可以使用信号量或者互斥锁来对__g_counter进行保护,确保同时只有一个任务可以访问它。下面是修改后的代码:


static init __g_counter;os_mutex_t __g_mutex; // 互斥锁,用于保护 __g_countervoid counter_increment(int count) {os_mutex_lock(__g_mutex); // 加锁_g_counter += count;os_mutex_unlock(__g_mutex); // 解锁
}void counter_decrement(int count) {os_mutex_lock(__g_mutex); // 加锁_g_counter -= count;os_mutex_unlock(__g_mutex); // 解锁
}

在这个修改后的版本中,通过使用互斥锁(os_mutex_t)来确保在counter_increment和counter_decrement函数中对__g_counter的访问是原子的。这样,同一时间只有一个任务可以访问__g_counter,从而避免了竞态条件的发生。

另外,你也可以使用信号量来实现同样的效果,即在访问__g_counter之前先获取信号量,在访问完成后释放信号量。

问题4

下面代码包含2个函数,第一个函数是中断服务程序用于从温湿度传感器中读取数据,第一个函数用于比较温度是否一致,他是否包括错误?如果有,如果纠正错误?

回答:

在给定的代码中,存在一个潜在的竞态条件(race condition)问题。竞态条件是指多个线程或进程并发执行时,由于执行顺序的不确定性导致程序出现不一致或错误的情况。

问题出现在中断服务程序isr_temperatures_read中,该程序从两个温度传感器中读取数据并存储在__g_temperatures数组中。由于中断可能在任何时刻发生,因此当一个中断正在更新__g_temperatures[0]时,另一个中断可能同时更新__g_temperatures[1],这可能导致数据不一致的情况。

为了解决这个问题,可以使用临界区(critical section)来确保在更新__g_temperatures数组时不被中断打断。具体做法是在更新__g_temperatures数组时禁用中断,然后在更新完成后重新启用中断。

static int __g_temperatures[2];__interrupt void isr_temperatures_read(void) {// 禁用中断disable_interrupts();__g_temperatures[0] = temperature_sensor1_read();__g_temperatures[1] = temperature_sensor2_read();// 重新启用中断enable_interrupts();
}void main(void) {while(1) {// 临界区开始disable_interrupts();if(__g_temperatures[0] != __g_temperatures[1]) {/* alarm*/}// 临界区结束enable_interrupts();}
}

在新代码中,使用了disable_interrupts()和enable_interrupts()函数来分别禁用和重新启用中断。这样就确保了在更新__g_temperatures数组时不会被中断打断,从而避免了竞态条件问题。

这篇关于嵌入式软件笔试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939727

相关文章

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

两道笔试题

“char a='\72'”是什么意思? 这么理解:\为转义字符,\072转义为一个八进制数072,也就是十进制数的58买一送一,将转义字符对照表也一并贴给你吧:转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms

实现的动态规划问题华为笔试题C++实现

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解; 动态规划中开始介绍的爬楼梯等问题,答

某公司笔试编程题

参加了某公司编程题,这些题都来自牛客网,记录总结吧! 一、蛇形矩阵 题目描述 蛇形矩阵是有1开始的自然数依次排列成的一个上三角矩阵. 接口说明 void GetResult(int Num, int* pResult);输入参数:int Num :输入的正整数N输出参数:int *pResult: 指向放蛇形矩阵的字符串指针指针指向的内存区域保证有效 样例输入: 4

CVTE java web后台实习生笔试+技术一面总结

投的第一份简历,也可以说是第一次写笔试和参加面试。题在前面,总结在最后,努力不骗人。 笔试 题型:20道不定项选择题+2道算法题+1道架构设计题 选择题 选择题出的很全面,因为是不定项选择,一道题就可以考很多知识点。 当时做的时候以为笔试都是这么难,做完实验室同学告诉我这个算比较难的了,而且据我观察可能是跟春招找正式offer的一批难度的题。可能最后过的标准不一样吧。 选项信息量很大,

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

C++笔试强训12、13、14

文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用:是一个别名,与其被引用的实体公用一份内存空间,编译器不会给引用变量单独开辟新的空间。A错误 故选A。 A

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ