嵌入式操作系统内核原理和开发(消息队列)

嵌入式操作系统内核原理和开发(消息队列)
嵌入式操作系统内核原理和开发(消息队列)

软件英才网软件行业驰名招聘网站

嵌入式操作系统内核原理和开发(消息队列)

消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入

式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者

都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已

满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以

把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量

和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了

方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节

上面。

首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,

1typedef struct RAW_MSG_Q {

2

3 RAW_VOID **queue_start; /* Pointer to start of queue data

*/

4 RAW_VOID **queue_end; /* Pointer to end of queue data

*/

5 RAW_VOID **write; /* Pointer to where next message will

be inserted in the Q */

6 RAW_VOID **read; /* Pointer to where next message will be

extracted from the Q */

7 RAW_U32 size; /* Size of queue (maximum number of entries)

*/

8 RAW_U32 current_numbers; /* Current number of entries in the

queue */

9 RAW_U16 blocked_send_task_numbers; /*number of blocked send task

numbers */

10 RAW_U16 blocked_receive_task_numbers; /*number of blocked send task

numbers */

11

12 } RAW_MSG_Q;

13

14typedef struct RAW_QUEUE

15 {

16 RAW_COMMON_BLOCK_OBJECT common_block_obj;

17 RAW_MSG_Q msg_q;

18

19 } RAW_QUEUE;

软件英才网软件行业驰名招聘网站

上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。

根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这,我们还是看看消息队列是怎么初始化的,

20RAW_U16 raw_queue_create(RAW_QUEUE *p_q, RAW_U8 *p_name, RAW_VOID

**msg_start, RAW_U32 number)

21 {

22

23 #if (RAW_QUEUE_FUNCTION_CHECK > 0)

24

25if (p_q == 0) {

26

27return RAW_NULL_OBJECT;

28 }

29

30if ( msg_start == 0) {

31

32return RAW_NULL_POINTER;

33 }

34

35if (number == 0) {

36

37return RAW_ZERO_NUMBER;

38 }

39

40 #endif

41

42 list_init(&p_q->common_block_obj.block_list);

43

44 p_q->common_block_https://www.360docs.net/doc/d85317648.html, = p_name;

45 p_q->common_block_obj.block_way = 0;

46 p_q->msg_q.queue_start = msg_start; /* Initialize

the queue */

软件英才网软件行业驰名招聘网站

47 p_q->msg_q.queue_end = &msg_start[number];

48 p_q->msg_q.write = msg_start;

49 p_q->msg_q.read = msg_start;

50 p_q->msg_q.size = number;

51 p_q->msg_q.current_numbers = 0;

52 p_q->msg_q.blocked_send_task_numbers = 0;

53 p_q->msg_q.blocked_receive_task_numbers = 0;

54return RAW_SUCCESS;

55 }

56

虽然相比较之前的互斥函数,消息队列的初始化内容好像多一些。但是大家如果对循环队列的知识比较了解的话,其实也不是很复杂的。我们看到,函数除了对通用阻塞结构进行初始化之外,就是对这些循环队列进行初始化。接着,我们就可以看看消息发送函数是怎么样的,

57static RAW_U16 internal_msg_post(RAW_QUEUE *p_q, RAW_VOID *p_void, RAW_U8 opt_send_method, RAW_U8 opt_wake_all, RAW_U32 wait_option)

58 {

59 RAW_U16 error_status;

60 LIST *block_list_head;

61 RAW_U8 block_way;

62

63 RAW_SR_ALLOC();

64

65 #if (RAW_QUEUE_FUNCTION_CHECK > 0)

66

67if (raw_int_nesting) {

68

69if (wait_option != RAW_NO_WAIT) {

70

71return RAW_NOT_CALLED_BY_ISR;

72 }

73 }

74

75if (p_q == 0) {

76

77return RAW_NULL_OBJECT;

78 }

79

80if (p_void == 0) {

81

软件英才网软件行业驰名招聘网站

82return RAW_NULL_POINTER;

83 }

84

85 #endif

86

87 block_list_head = &p_q->common_block_obj.block_list;

88

89 RAW_CRITICAL_ENTER();

90

91/*queue is full condition, there should be no received task blocked on queue object!*/

92if (p_q->msg_q.current_numbers >= p_q->msg_q.size) {

93

94if (wait_option == RAW_NO_WAIT) {

95 RAW_CRITICAL_EXIT();

96return RAW_MSG_MAX;

97 }

98

99else {

100

101/*system is locked so task can not be blocked just return immediately*/ 102if (raw_sched_lock) {

103 RAW_CRITICAL_EXIT();

104return RAW_SCHED_DISABLE;

105 }

106/*queue is full and SEND_TO_FRONT method is not allowd*/

107if (opt_send_method == SEND_TO_FRONT) {

108

109 RAW_CRITICAL_EXIT();

110return RAW_QUEUE_FULL_OPT_ERROR;

111 }

112

113 p_q->msg_q.blocked_send_task_numbers++;

114 raw_task_active->msg = p_void;

115 block_way = p_q->common_block_obj.block_way;

116 p_q->common_block_obj.block_way = RAW_BLOCKED_WAY_FIFO;

117/*there should be no blocked received task beacuse msg exits*/

118 raw_pend_object(&p_q->common_block_obj, raw_task_active,

wait_option);

119 p_q->common_block_obj.block_way = block_way;

120

121 RAW_CRITICAL_EXIT();

122

软件英才网软件行业驰名招聘网站

123 raw_sched();

124

125 error_status = block_state_post_process(raw_task_active, 0); 126

127return error_status;

128

129 }

130

131 }

132

133/*Queue is not full here, there should be no blocked send task*/

134/*If there is no blocked receive task*/

135if (is_list_empty(block_list_head)) {

136

137 p_q->msg_q.current_numbers++; /* Update the nbr of entries in the queue */

138

139if (opt_send_method == SEND_TO_END) {

140

141 *p_q->msg_q.write++ = p_void;

142

143if (p_q->msg_q.write == p_q->msg_q.queue_end) {

144

145 p_q->msg_q.write = p_q->msg_q.queue_start;

146

147 }

148

149 }

150

151else {

152

153if (p_q->msg_q.read == p_q->msg_q.queue_start) { 154 p_q->msg_q.read = p_q->msg_q.queue_end;

155 }

156

157 p_q->msg_q.read--;

158 *p_q->msg_q.read = p_void; /* Insert message into queue */

159

160 }

161

162 RAW_CRITICAL_EXIT();

163

软件英才网软件行业驰名招聘网站164return RAW_SUCCESS;

165 }

166

167/*wake all the task blocked on this queue*/

168if (opt_wake_all) {

169

170while (!is_list_empty(block_list_head)) {

171 wake_send_msg(list_entry(block_list_head->next, RAW_TASK_OBJ, task_list), p_void);

172 }

173

174 p_q->msg_q.blocked_receive_task_numbers = 0;

175 }

176

177/*wake hignhest priority task blocked on this queue and send msg to it*/ 178else {

179

180 wake_send_msg(list_entry(block_list_head->next, RAW_TASK_OBJ,

task_list), p_void);

181 p_q->msg_q.blocked_receive_task_numbers--;

182 }

183

184 RAW_CRITICAL_EXIT();

185

186 raw_sched();

187return RAW_SUCCESS;

188 }

189

这里消息发送函数稍显冗长,这主要是因为消息发送的情况比较复杂,方方面面考虑的情况比较多。但是整个函数处理的逻辑还是比较清晰的,只要有耐心,慢慢读下去还是没有什么问题。这里不妨和大家一起看一下消息发送函数是怎么实现的,

(1)检验参数合法性,注意在中断下调用这个函数时,必须是RAW_NO_WAIT的选项,中断毕竟是不好调度的;

(2)处理消息已满的情况,

a)如果线程不想等待,函数返回;

b)如果禁止调度,函数返回;

c)消息存储到线程的msg里面,线程把自己pend到等待队列中;

d)调用系统调度函数,等待再次被调度的机会,函数返回。

(3)当前消息未满,但是当前没有等待队列,那么根据要求把消息压入循环队列,函数返回;

(4)当前消息未满,且存在等待队列,说明此时已经没有消息可读,

a)如果需要唤醒所有的等待线程,那么唤醒所有的线程,等待线程总数置为0;

软件英才网软件行业驰名招聘网站b)如果只是唤起某一个线程,那么唤醒第一个等待线程,等待线程总数自减;

(5)调用系统调度函数,防止有高优先级的线程加入调度队列;

(6)线程再次得到运行的机会,函数返回。

看到上面的代码,我们发现只要梳理好了代码的逻辑,其实消息发送函数也是比较好理解的。当然,有消息的发送,就必然会存在消息的接受了。此时肯定也会出现没有消息、有消息两种情况了。

190RAW_U16 raw_queue_receive (RAW_QUEUE *p_q, RAW_U32 wait_option, RAW_VOID **msg) 191 {

192

193 RAW_VOID *pmsg;

194 RAW_U16 result;

195 LIST *block_list_head;

196 RAW_TASK_OBJ *blocked_send_task;

197

198 RAW_SR_ALLOC();

199

200 #if (RAW_QUEUE_FUNCTION_CHECK > 0)

201

202if (raw_int_nesting) {

203

204return RAW_NOT_CALLED_BY_ISR;

205

206 }

207

208if (p_q == 0) {

209

210return RAW_NULL_OBJECT;

211 }

212

213if (msg == 0) {

214

215return RAW_NULL_POINTER;

216 }

217

218 #endif

219

220 block_list_head = &p_q->common_block_obj.block_list;

221

软件英才网软件行业驰名招聘网站

222 RAW_CRITICAL_ENTER();

223

224

225/*if queue has msgs, just receive it*/

226if (p_q->msg_q.current_numbers) {

227

228 pmsg = *p_q->msg_q.read++;

229

230if (p_q->msg_q.read == p_q->msg_q.queue_end) {

231 p_q->msg_q.read = p_q->msg_q.queue_start;

232 }

233

234 *msg = pmsg;

235

236/*if there are blocked_send_tasks, just reload the task msg to end*/

237if (p_q->msg_q.blocked_send_task_numbers) {

238

239 blocked_send_task = list_entry(block_list_head->next, RAW_TASK_OBJ,

task_list);

240

241 p_q->msg_q.blocked_send_task_numbers--;

242

243 *p_q->msg_q.write++ = blocked_send_task->msg; 244

245if (p_q->msg_q.write == p_q->msg_q.queue_end) {

246

247 p_q->msg_q.write = p_q->msg_q.queue_start;

248

249 }

250

251 raw_wake_object(blocked_send_task);

252 RAW_CRITICAL_EXIT();

253

254 raw_sched();

255return RAW_SUCCESS;

256

257 }

258

259 p_q->msg_q.current_numbers--;

260

261 RAW_CRITICAL_EXIT();

262

263return RAW_SUCCESS;

软件英才网软件行业驰名招聘网站264 }

265

266

267

268if(wait_option == RAW_NO_WAIT) { /* Caller wants to block if not available?

*/

269 *msg = (RAW_VOID *)0;

270 RAW_CRITICAL_EXIT();

271return RAW_NO_PEND_WAIT;

272 }

273

274if (raw_sched_lock) {

275 RAW_CRITICAL_EXIT();

276return RAW_SCHED_DISABLE;

277 }

278

279 raw_pend_object(&p_q->common_block_obj, raw_task_active, wait_option);

280 p_q->msg_q.blocked_receive_task_numbers++;

281

282 RAW_CRITICAL_EXIT();

283

284 raw_sched();

285

286 RAW_CRITICAL_ENTER();

287

288 *msg = (RAW_VOID *)0;

289 result = block_state_post_process(raw_task_active, msg);

290

291 RAW_CRITICAL_EXIT();

292

293return result;

294

295 }

296

和发送消息函数相比,接受消息的操作还是要少一些,不要紧,大家一起来看一下实现

逻辑,

(1)判断参数合法性;

(2)如果当前存在消息,

a)读取循环队列中的消息;

b)判断当前是否存在等待线程,因为之前有可能存在没有压入队列的消息,

那么此时压入消息,唤醒该线程即可,调用系统调度函数返回;

c)没有等待线程,消息总数自减,函数返回。

(3)当前没有消息,

软件英才网软件行业驰名招聘网站a)线程不愿等待,函数返回;

b)系统禁止调度,函数返回;

c)线程将自己pend到等待队列中;

d)调用系统调度函数,切换到其他线程继续运行;

e)线程再次获得运行的机会,从thread结构中获取返回结果,函数返回。

和发送消息、接受消息比较起来,清除消息和删除消息的处理就比较简单了。为了说明问题,我们不妨放在一起讨论一下,

297RAW_U16 raw_queue_flush(RAW_QUEUE *p_q)

298 {

299 LIST *block_list_head;

300

301 RAW_SR_ALLOC();

302

303 RAW_TASK_OBJ *block_task;

304

305 #if (RAW_QUEUE_FUNCTION_CHECK > 0)

306

307if (p_q == 0) {

308

309return RAW_NULL_OBJECT;

310 }

311

312 #endif

313

314 block_list_head = &p_q->common_block_obj.block_list;

315

316 RAW_CRITICAL_ENTER();

317

318/*if queue is full and task is blocked on this queue, then wake all the task*/ 319if (p_q->msg_q.current_numbers >= p_q->msg_q.size) {

320while (!is_list_empty(block_list_head)) {

321 block_task = list_entry(block_list_head->next, RAW_TASK_OBJ, task_list);

322 raw_wake_object(block_task);

323 block_task->block_status = RAW_B_ABORT;

324

325 }

326

327 p_q->msg_q.blocked_send_task_numbers = 0;

软件英才网软件行业驰名招聘网站328 }

329

330 RAW_CRITICAL_EXIT();

331

332 raw_sched();

333

334return RAW_SUCCESS;

335 }

336 #endif

337

338

339 #if (CONFIG_RAW_QUEUE_DELETE > 0)

340 RAW_U16 raw_queue_delete(RAW_QUEUE *p_q)

341 {

342 LIST *block_list_head;

343

344 RAW_SR_ALLOC();

345

346 #if (RAW_QUEUE_FUNCTION_CHECK > 0)

347

348if (p_q == 0) {

349

350return RAW_NULL_OBJECT;

351 }

352

353 #endif

354

355 block_list_head = &p_q->common_block_obj.block_list;

356

357 RAW_CRITICAL_ENTER();

358

359/*All task blocked on this queue is waken up*/

360while (!is_list_empty(block_list_head)) {

361 delete_pend_obj(list_entry(block_list_head->next, RAW_TASK_OBJ, task_list));

362 }

363

364 RAW_CRITICAL_EXIT();

365

366 raw_sched();

367

368return RAW_SUCCESS;

369

软件英才网软件行业驰名招聘网站370 }

371 #endif

372

从代码据结构上也看得出来,两个函数的处理逻辑十分相像,所以可以放在一起研究一下,

(1)判断参数合法性;

(2)唤醒等待线程,这里消息清除函数唤醒的是发送线程,而消息删除函数唤醒的所有线程;

(3)调用系统调度函数,切换到其他线程继续运行;

(4)当前线程再次获得运行的机会,函数返回,一切ok搞定。

嵌入式习题答案

嵌入式习题答案Last revision on 21 December 2020

第一章习题答案 1.什么是嵌入式系统请列举几个常见的嵌入式系统。 答:根据国际电气和电子工程师协会(IEEE)的定义,嵌入式系统是控制、监视或者辅助设备、机器和生产线运行的装置(Devices used to control, monitor, or assist the operation of equipment, machinery or plants)。这主要是从产品的应用角度加以定义的,由此可以看出嵌入式系统是软件和硬件的综合体,可以涵盖机械等附属装置。 目前被我国科学家普遍认同的定义是:嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁减,对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统。 常见的嵌入式系统:手机,DVD,路由器,核磁共振仪,全自动洗衣机。 2.嵌入式系统与通用计算机有哪些区别 答:(1) 以应用为中心;(2) 以计算机技术为基础(3) 软件和硬件可裁减(4) 对系统性能要求严格(5)软件的固件化(6)需要专用的开发工具 3.嵌入式系统的发展分为哪几个阶段 答:第一阶段:无操作系统的嵌入算法阶段。第二阶段:以嵌入式CPU为基础,以简单操作系统为核心的嵌入式系统。第三阶段:以嵌入式操作系统为标志的嵌入式系统。第四阶段:以基于Internet为标志的嵌入式系统。 4.请列举嵌入式系统的主要应用领域。 答:(1)工业控制领域(2)交通运输领域(3)消费电子产品(4)家电领域(5)通信领域(6)商业和金融领域(7)环境监测领域(8)医疗领域(9)建筑领域(10)军事国防领域(11)航天航空领域

三种常用的嵌入式操作系统分析与比较

三种常用的嵌入式操作系统分析与比较 摘要:提要三种常用的嵌入式操作系统——Palm OS、Windows CE、Linux;在此基础上、分析、比较这三种嵌入式操作系统,给出它们之间的异同点及各自的适用范围。 1 嵌入式系统与嵌入式操作系统 1.1 嵌入式系统 嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性能有严格要求的专用计算机系统。 嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 1.2 嵌入式操作系统 嵌入式操作系统EOS (Embedded Operating System)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。EOS负责嵌入系统的全部软、硬件资源的分配、调度作,控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。目前,已推出一些应用比较成功的EOS产品系列。随着Internet技术的发展、信息家电的普及应用及EOS的微型化和专业化,EOS开始从单一的弱功能向高专业化的强功能方向发展。嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固化以及应用的专用性等方面具有较为突出的特点。EOS是相对于一般操作系统而方的,它除具备了一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件处理等外,还有以下特点: ①可装卸性。开放性、可伸缩性的体系结构。 ②强实时性。EOS实时性一般较强,可用于各种设备控制当中。 ③统一的接口。提供各种设备驱动接口。

RabbitMQ的应用场景以及基本原理介绍

RabbitMQ的应用场景以及基本原理介绍 1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。 2.应用场景 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式 (1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西. (2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

假设三个业务节点分别使用50ms,串行方式使用时间 150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,英爱是写入数据库后就返回. (3)消息队列 引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理 由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。2.2 应用解耦 场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.

这种做法有一个缺点: 当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱^ ^)订单系统和库存系统高耦合. 引入消息队列 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了). 流量削峰 流量削峰一般在秒杀活动中应用广泛 场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。 作用: 1.可以控制活动人数,超过此一定阀值的订单直接丢弃(我为

arm嵌入式系统基础教程课后答案.doc

arm 嵌入式系统基础教程课后答案【篇一:arm 嵌入式系统基础教程习题答案周立功】 /p> 1 、举出3 个书本中未提到的嵌入式系统的例子。 答:红绿灯控制,数字空调,机顶盒 2、什么叫嵌入式系统 嵌入式系统:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的 专用计算机系统。 3、什么叫嵌入式处理器?嵌入式处理器分为哪几类? 嵌入式处理器是为完成特殊的应用而设计的特殊目的的处理器。 嵌入式微处理器(embedded microprocessor unit, empu) 嵌入式微控制器(microcontroller unit, mcu) 嵌入式dsp 处理器(embedded digital signal processor, edsp) 嵌入式片上系统(system on chip) 4、什么是嵌入式操作系统?为何要使用嵌入式操作系统? 是一段在嵌入式系统启动后首先执行的背景程序,首先,嵌入式实 时操作系统提高了系统的可靠性。其次,提高了开发效率,缩短了 开发周期。再次,嵌入式实时操作系统充分发挥了32 位cpu 的多任务潜力。 第二章 1、嵌入式系统项目开发的生命周期分哪几个阶段?各自的具体任务 是什么? 项目的生命周期一般分为识别需求、提出解决方案、执行项目和结 束项目 4 个阶段。识别需求阶段的主要任务是确认需求,分析投资 收益比,研究项目的可行性,分析厂商所应具备的条件。 提出解决方案阶段由各厂商向客户提交标书、介绍解决方案。 执行项目阶段细化目标,制定工作计划,协调人力和其他资源;定 期监控进展,分析项目偏差,采取必要措施以实现目标。 结束项目阶段主要包括移交工作成果,帮助客户实现商务目标;系 统交接给维护人员;结清各种款项。 2、为何要进行风险分析?嵌入式项目主要有哪些方面的风险? 在一个项目中,有许多的因素会影响到项目进行,因此在项目进行 的初期,在客户和开发团队都还未投入大量资源之前,风险的评估

ARM的十一种嵌入式操作系统

ARM的十一种嵌入式操作系统 ARM的十一种嵌入式操作系统 嵌入式LINUX 嵌入式Linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。Linux做嵌入式 的优势,首先,Linux是开放源代码;其次,Linux的内核小、效率高,可以定制,其系统内核最小只有约134KB;第三,Linux是免费 的OS,Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台而且性能稳定,裁剪性很好,开发和使用都很容易。同时,Linux内核的结构在网络方面是非常 完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持。提 供了包括十兆、百兆、千兆的以太网络,以及无线网络, TokenRing(令牌环网)、光纤甚至卫星的支持。 移植步骤:1.Bootloader的移植;2.嵌入式Linux操作系统内核 的移植;3.嵌入式Linux操作系统根文件系统的创建;4.电路板上外 设Linux驱动程序的编写。 WinCE WinCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设 备操作系统,它是精简的Windows95,WinCE的图形用户界面相当出色。WinCE是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对于从掌上电脑到 专用的工业控制器的用户电子设备进行定制。操作系统的基本内核 需要至少200K的ROM。 一般来说,一个WinCE系统包括四层结构:应用程序、WinCE内 核映像、板级支持包(BSP)、硬件平台。而基本软件平台则主要由

IBM MQ 概述

IBM MQ 介绍 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。 IBM WebSphere MQ 产品支持应用程序通过不同组件如处理器、子系统、操作系统以及通信协议的网络彼此进行通信。例如,IBM WebSphere MQ 支持35 种以上的不同操作系统。 IBM WebSphere MQ 支持两种不同的应用程序编程接口:Java 消息服务(JMS)和消息队列接口(MQI)。在IBM WebSphere MQ 服务器上,JMS 绑定方式被映射到MQI。如图 3 所示,应用程序直接与其本地队列管理器通过使用MQI 进行对话,MQI 是一组要求队列管理器提供服务的调用。MQI 的引人之处是它只提供13 次调用。这意味着对于应用程序编程员它是一种非常易于使用的接口,因为大部分艰苦工作都将透明完成的。 图形 2. IBM WebSphere MQ 编程 图2 显示了IBM WebSphere MQ 编程的原理。第一步是让应用程序与队列管理器连接。它通过MQConnect 调用来进行此连接。下一步使用MQOpen 调用为输出打开一个队列。然后应用程序使用MQPut 调用将其数据放到队列上。要接收数据,应用程序调用MQOpen 调用打开输入队列。应用程序使用MQGet 调用从队列上接收数据。

嵌入式系统课后答案马维华

第1章嵌入式系统概述 1,什么是嵌入式系统嵌入式系统的特点是什么 嵌入式系统概念: (1) IEEE对嵌入式系统的定义:用于控制,监视或者辅助操作机器和设备的装置. (2)一般定义:以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能,可靠性,成本,体积,功耗有严格要求的专用计算机系统. 嵌入式系统的特点: (1) 专用的计算机系统 (2) 必须满足环境要求 (3) 必须能满足对象系统的控制要求 (4) 是集成计算机技术与各行业应用的集成系统 (5) 具有较长的生命周期 (6) 软件固化在非易失性存储器中 (7) 必须能满足实时性要求 (8) 需要专用开发环境和开发工具 2,简单分析几种嵌入式操作系统的主要特点,包括嵌入式Linux,Windows CE,uCOS II 及VxWorks. (1)嵌入式Linux:有多个主流版本,根据应用需求,性能略有差别.μCLinux是Linux小型化后,适合于没有MMU的微处理器芯片而裁剪成的操作系统,μCLinux保持了传统Linux操作系统的主要特性,包括稳定,强大的网络和文件系统的支持,μCLinux裁剪了大量的Linux内核以缩小尺寸,适合像512KB RAM,1MB Flash这样小容量,低成本的嵌入式系统.RT_Linux即能兼容通常的Linux,又能保证强实时性. (2)Windows CE:开发平台主要为WinCE Platform Builder,有时也用EVC环境开发一些较上层的应用.WinCE开发难度远低于嵌入式Linux,实时性略低,常用于手机,PDA等手持设备中. (3)uCOS II:结构小巧,抢先式的实时嵌入式操作系统,具有执行效率高,占用空间小,可移植性强,实时性能好和可扩展性能等优点.主要用于小型嵌入式系统. (4) VxWorks: 集成开发环境为Tornado,Vxworks因出现稍早,实时性很强,并且内核可极微(最小8K),可靠性较高等.通常应用在通信设备等实时性要求较高的系统中. 第2章嵌入式处理器体系结构 1,具体说明ARM7TDMI的含义,其中的T,D,M,I分别代表什么 ARM7TDMI是ARM7处理器系列成员之一,采用V4T版本指令.T表示Thumb,该内核可从16位指令集切换到32位ARM指令集;D表示Debug,该内核中放置了用于调试的结构,支持片内Debug调试;M表示Multiplier,支持位乘法;I表示Embedded ICE ,内含嵌入式ICE宏单元,支持片上断点和观察点. 2,ARMV4及以上版本的CPSR的哪一位反映了处理器的状态若CPSR=0x000000090,分析系统状态.CPSR=0x000000090表示当前处理器工作于ARM状态,系统处于用户模式下. CPSR的BIT5(T)反映当前处理器工作于ARM状态或Thumb状态. 3,ARM有哪几个异常类型,为什么FIQ的服务程序地址要位于0x1C 在复位后,ARM处理器处于何种模式,何种状态 ARM的7种异常类型:复位RESET异常,未定义的指令UND异常,软件中断SWI异常,指令预取中止PABT异常,数据访问中止DABT异常,外部中断请求IRQ异常,快速中断请求FIQ 异常.在有快速中断发生时,CPU从0x1C处取出指令执行.ARM复位后处于管理模式,工作于ARM状态. 4,为什么要使用Thumb模式,与ARM代码相比较,Thumb代码的两大优势是什么

嵌入式操作系统精彩试题集61374

第一章嵌入式系统概论 一.填空 1. 嵌入式系统是以嵌入式应用为目的、以计算机技术为基础的计算机系统。 2. 计算机系统按应用可以分为通用计算机系统和嵌入式计算机系统。 3. 嵌入式系统按软件结构可分为嵌入式单线程系统和嵌入式事件驱动系统。 4. 嵌入式系统按是否具有实时性能可分为嵌入式非实时系统和嵌入式实时系统。 5. 嵌入式实时系统除具有嵌入式系统的基本特征外,还具实时性和可靠性的重要特点。 6. 嵌入式系统的硬件架构是以嵌入式处理器为中心,由存储器,I/O设备,通信模块以及电源等必要的辅助接口组成。 7. 嵌入式系统的软件通常固态化存储在ROM、FLASH或NVRAM中。 8. 嵌入式系统的开发由于受到系统资源开销的限制,通常采用交叉开发环境。 9. 嵌入式系统开发采用的交叉开发环境是由宿主机和目标机组成的。 10. 嵌入式系统的设计是使用一组物理硬件和软件来完成所需功能的过程。 二.选择 1. 以下哪一项不属于嵌入式操作系统(C) A.VxWorks B. WinCE C. BSD D. uClinux 2. 以下关于嵌入式系统说确的是(A) A.以开发为中心 B 对实时,成本,功耗要求严格 C.软硬件协同 D 软件可剪裁 3. 以下关于嵌入式系统说确的是(A) A.嵌入的系统中可以共存多个嵌入式系统 B.对高性能要求严格

C.软硬件缺乏协同 D.不要时性 4. 对响应时间有严格要求的嵌入式系统是(A) A.嵌入式实时系统 B.嵌入式多线程系统 C.嵌入式多核系统 D.嵌入式轮转询问系统 5. 以下哪一项属于嵌入式系统不具备的特点(B) A.采用专用处理器 B. 跨平台可移植 C.软硬件协同一体化 D.小型化与有限资源 6. 嵌入式系统硬件的核心是(B) A.存储器 B.嵌入式微处理器 C.嵌入式微控制器 D.BSP 7. 嵌入式系统的软件部分不包括(A) A.DSP B.嵌入式操作系统 C.设备驱动程序D.应用程序 8. 对性能要求高的嵌入式系统是(C) A.嵌入式实时系统 B.嵌入式多线程系统 C.嵌入式多核系统 D.嵌入式轮转询问系统 9. 嵌入式应用软件的开发阶段不包括(D) A.交叉编译和 B.开发环境的建立 C.联机调试 D.应用程序模块加载 10. 为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都保存在(A) A.存储器芯片 B.磁盘 C.cache D.CDROM

嵌入式操作系统期末考试答案

填空 1、嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪、适用于应用系统,对(功能)、(可靠性)、(成本)、(体积)、(功耗)严格要求的专用计算机系统。 2、嵌入式系统开发采用的交叉开发环境是由(宿主机)和(目标机)组成的。 3、挂载设备到文件系统的命令是(mount),从文件系统中卸载设备命令是(umounts)。 4、在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面,进入vi之后,是处于 (命令)模式,要切换到(编辑)模式才能够输入文字。 5、GCC的编译流程分为4个步骤,分别为:(预处理),编译,(汇编),链接。 6、Linux系统的设备分为三类:(字符设备)、(块设备)和网络设备。 7、操作系统的功能包(处理机管理)、(存储管理)、(设备管理)、(信息管理)、(作业管理)。 选择 1、下面哪点不是嵌入式操作系统的特点。(C) (A)内核精简(B)专用性强(C)功能强大(D)高实时性 2、嵌入式Linux下常用的文件系统不包括以下哪一项(A) (A)nfs(B)romfs(C)yaffs(D)jffs 3、下面关于Shell的说法,不正确的是:(D) (A)操作系统的外壳(B)用户与Linux内核之间的接口程序(C)一个命令语言解释器(D)一种和C语言类似的程序语言 4、在Bootloader()模式下,目标机可以通过通信手段从主机更新系统。(B) (A)启动加载模式(B)下载模式(C)实时模式(D)保护模式 5、文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列命令正确的是: (A) (A)chmoda+xg+wexer1(B)chmod765exer1(C)chmodo+xexer1(D)chmodg+wexer1 6、在vi编辑环境中,下面()选项不是从命令行模式切换到插入模式。(C) (A)i(B)o(C)ESC(D)a 7、shell变量名命名中不包括()。(D) (A)字母(B)数字(C)下划线(D)括号 8、下列关于字符设备说法不正确的是()。(C) (A)以字节为单位逐个进行I/O操作(B)字符设备中的缓存是可有可无的 (C)支持随机访问(D)字符设备可以通过设备文件节点访问 9、以下哪一项是是硬盘设备文件()。(B) (A)fd0(B)hda(C)eth1(D)ht0 10、共享内存通信机制的缺点是()。(B) (A)需要花费额外的内存空间(B)需要使用额为的同步机制 (C)需要额外硬件支持(D)通信过程中需要反复读取内存,时间开销大 简答题 1.嵌入式操作系统在哪些方面较为突出的特点并请列举出4种目前较常用的手机嵌入 式操作系统。 四个方面:系统实时高效性硬件的相关依赖性软件固态化应用的专用性 四种手机操作系统:Window Mobile SymbianOSAndriod OSE

常见的嵌入式操作系统

常见的嵌入式操作系统 分类:嵌入式操作系统2012-12-11 10:06 459人阅读评论(1) 收藏举报嵌入式操作系统 嵌入式操作系统与通用的操作相比较主要特点在于: 1.小内核,稳定可靠。 2.需要可装卸、可裁剪,以便能灵活应对各种不同的硬件平台。 3.面向应用,强实时性,可用于各种设备控制当中。 国际上常见的嵌入式操作系统大约有40种左,右如:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive 。他们基本可以分为两类,一类是面向控制、通信等领域的实时操作系统,如windriver公司的vxworks、isi的psos、qnx系统软件公司的qnx、ati的nucleus等;另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(pda)、移动电话、机顶盒、电子书、webphone等,系统有Microsoft的WinCE,3Com 的Palm,以及Symbian和Google的Android等。 一、VxWorks VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是T ornado嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌人式实时操作系统领域逐渐占据一席之地。VxWorks具有可裁剪微内核结构;高效的任务管理;灵活的任务间通讯;微秒级的中断处理;支持POSIX 1003.1b实时扩展标准;支持多种物理介质及标准的、完整的TCP/IP网络协议等。 然而其价格昂贵。由于操作系统本身以及开发环境都是专有的,价格一般都比较高,通常需花费10万元人民币以上才能建起一个可用的开发环境,对每一个应用一般还要另外收取版税。一般不通供源代码,只提供二进制代码。由于它们都是专用操作系统,需要专门的技术人员掌握开发技术和维护,所以软件的开发和维护成本都非常高。支持的硬件数量有限。 二、Windows CE Windows CE与Windows系列有较好的兼容性,无疑是Windows CE推广的一大优势。其中WinCE3.0是一种针对小容量、移动式、智能化、32位、了解设备的模块化实时嵌人式操

MQ介绍与选型

MQ介绍与选型 MQ使用场景 ?异步通信 有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。 ?解耦 降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 ?冗余 有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。 ?扩展性 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。 ?过载保护

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;如果以为了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 ?可恢复性 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 ?顺序保证 在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。 ?缓冲 在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。 以调节系统响应时间。 ?数据流处理 分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。

孟祥莲嵌入式系统原理及应用教程部分习题答案

习题1 1. 嵌入式系统的概念的是什么?答:嵌入式系统是以应用为中心,以计算机技 术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。) 2. 嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4. 嵌入式系统的功能是什么?答:提供强大的网络服务小型化,低成本,低 功能;人性化的人机界面;完善的开发平台 5. 嵌入式系统的硬件平台由哪些部分组成?答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O 单元电路,通信模块,外部设备必要的辅助接口组成的。 7. 嵌入式操作系统的主要特点是什么?答:体积小;实时性;特殊的开发调试环境。 8. 叙述嵌入式系统的分类。答:按嵌入式微处理器的位数分类可以分为4 位、 8 位、16 位、32 位和64 位等;按软件实时性需求分类可以分为非实时系统(如PDA), 软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统)按嵌入式系统的复杂程度分类可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 处理器和工作状态有哪些?

答:ARM犬态:此时处理器执行32位的的字对齐的ARS旨令。 Thumb犬态:此时处理器执行16位的,半字对齐的Thumb旨令 2.叙述ARM9内部寄存器结构,并分别说明R13 R14 R15寄存器的 作用。 答:共有37个内部寄存器,被分为若干个组(BANK,这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处理 外部中断模式:用于通用中断处理管理模式:操作系统使用的保护模式数据访问终止模式:当数据或指令预期终止时进入该模式,可用于虚拟存储器及存储保护 系统模式:运行具有特权的操作系统任务 未定义指令终止模式:当未定义的指令执行时进入该模式,可用 于支持硬件协处理器的软件仿真。 微处理器支持的数据类型有哪些? 答:ARM微处理器中支持字节(8位)、半字(16位),字(32 位)

嵌入式操作系统及编程试题(B)答案

《嵌入式操作系统及编程》考试试卷(B卷)参考答案 一、填空题(每空1分,共10分) 1、嵌入式硬件系统,嵌入式软件系统。 2、Windows CE; uClinux(或Linux)。VxWorks,uC/OSII。 3、C++ 4、tar -zcf mydir.tar.bz2 mydir,tar -zxvf mydir.tar.bz2 5、make 二、选择题(每题2分,共20分) 1、C 2、C 3、B 4、A 5、B 6、A 7、B 8、D 9、B 10、A 三、简答题(每题7分,共49分) 1、以应用为中心,以计算机技术为基础,软件硬件可剪裁,(3分)适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。(4分) 2、 (7分) 3、 (7分) 4、(1)解压:tar –zxvf Linux-2.4.18.tar.gz。 (2)修改Makefile文件,其中:SUBARCH :=arm CROSS_COMPILE = arm-linux- (3分)(3)运行make menuconfig; (4)make; (4分)5、(1)tar –jxvf vivi-2410.tar.bz2 (2)cd vivi-2410; (3分)

(3)make menuconfig; (4)make (4分)6、(1)tar -jxvf busybox-1.12.1.tar.bz2 (2)make menuconfig (3)make install (3分)(4)构建根文件系统:创建顶层目录,创建设备节点,创建inittab,创建sysinit脚本。 (5)创建根文件系统映像文件(4分)7、 (7分) 四、应用题(1题10分,2题11分,共21分) 1、(1)运行source x86QT/export.sh建立LCD和设置开发环境变量; (2)运行x86QT/qt-2.3.2/bin/desinger 建立QT的form窗口; (3)保存form窗口到磁盘,如:rbz/win.ui。 (4) vi main.cpp文件到保存的路径rbz下 (5) cd arm2410QT;运行source export.sh (6)创建win.pro工程文件:/root/arm2410QT/tmake-1.13/bin/progen -t app.t -o win.pro (7)创建Makefile文件:/root/arm2410QT/tmake-1.13/bin/tmake -o Makefile win.pro (8)创建bi文件win: make (5分)(9)挂接/usr/lib库到目标机上:mount –t nfs 192.168.0.21:/usr /mnt/yaffs/nfs (10)设置目标机上运行QT程序的环境变量: export QTDIR=/mnt/yaffs/nfs export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH (11)在目标机上运行:./win –qws (5分)2、(1)main.c程序: int main() { int x=1; int y=2; Printf(“%d”,x*y); } (5分)(2) 1):gcc -E main.c -o outfile1 2):gcc -S main.c 3):gcc -c main.c (6分)

zeromq的工作原理及使用

zeromq的工作原理及使用

一、ZeroMQ使用 1.1ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。 ZeroMQ看起来想一个可嵌入的网络库,但其作用就像是一个并发框架。它为你提供了各种传输工具,如进程内,进程间,TCP和组播中进行原子消息传递的套接字。你可以使用各种模式实现N对N的套接字连接,这些模式包括发布订阅,请求应答,扇出模式,管道模式。它的速度足够快,因此可以充当集群产品的结构,他的异步IO模型提供了可扩展的多核应用程序,用异步消息来处理任务。它虽然是以C为源码进行开发,但是可以绑定多种语言。 1.2请求/应答模式 说到“请求-应答”模式,不得不说的就是它的消息流动模型以及数据包装模型。 消息流动模型指的是该模式下,必须严格遵守“一问一答”的方式。发出消息后,若没有收到回复,再发出第二条消息时就会抛出异常。同样的,对于Rep也是,在没有接收到消息前,不允许发出消息。基于此构成“一问一答”的响应模式。 1.2.1服务端 import time import zmq

context=zmq.Context() socket=context.socket(zmq.REP) socket.bind("tcp://*:5555") while True: #Wait for next request from client message=socket.recv() print("Received request:%s"%message) #Do some'work' time.sleep(1) #Send reply back to client socket.send(b"World") 1.2.2客户端 import zmq context=zmq.Context() #Socket to talk to server print("Connecting to hello world server…") socket=context.socket(zmq.REQ) socket.connect("tcp://localhost:5555") #Do10requests,waiting each time for a response for request in range(10): print("Sending request%s…"%request) socket.send(b"Hello") #Get the reply. message=socket.recv() print("Received reply%s[%s]"%(request,message))

嵌入式Linux系统开发教程很完整的习题答案资料

参考答案 第一章 一、填空题。 1、嵌入式系统主要融合了计算机软硬件技术、通信技术和微电子技术,它是将计算机直接嵌入到应用系统中,利用计算机的高速处理能力以实现某些特定的功能。 2、目前国内对嵌入式系统普遍认同的定义是:以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 3、嵌入式系统一般由嵌入式计算机和执行部件组成,其中嵌入式计算机主要由四个部分组成,它们分别是:硬件层、中间层、系统软件层以及应用软件层。 4、嵌入式处理器目前主要有ARM、MIPS、Power PC、68K等,其中arm处理器有三大特点:体积小、低功耗、的成本和高性能,16/32位双指令集,全球合作伙伴众多。 5、常见的嵌入式操作系统有:Linux、Vxworks、WinCE、Palm、uc/OS-II和eCOS。 6、嵌入式系统开发的一般流程主要包括系统需求分析、体系结构设计、软硬件及机械系统设计、系统集成、系统测试,最后得到最终产品。 二、选择题 1、嵌入式系统中硬件层主要包含了嵌入式系统重要的硬件设备:、存储器(SDRAM、ROM等)、设备I/O接口等。(A) A、嵌入式处理器 B、嵌入式控制器 C、单片机 D、集成芯片 2、20世纪90年代以后,随着系统应用对实时性要求的提高,系统软件规模不断上升,实时核逐渐发展为,并作为一种软件平台逐步成为目前国际嵌入式系统的主流。(D) A、分时多任务操作系统 B、多任务操作系统 C、实时操作系统 D、实时多任务操作系统 3、由于其高可靠性,在美国的火星表面登陆的火星探测器上也使用的嵌入式操作系统是。(B) A、Palm B、VxWorks C、Linux D、WinCE [在此处键入]

嵌入式系统试题闭卷及答案

《嵌入式系统》试题 闭卷答题时间:30分钟 一、填空题(请将答案填入题后括号中):共10小题,每小题2分,满分20分。 1、一般而言,嵌入式系统的构架可以分为4个部分:分别是()、存储器、输入/输出和软件,一般软件亦分为操作系统相关和()两个主要部分。 2、根据嵌入式系统使用的微处理器,可以将嵌入式系统分为嵌入式微控制器,(),()以及片上系统。 3、操作系统是联接硬件与应用程序的系统程序,其基本功能有()、进程间通信、()、I/O资源管理。 4、从嵌入式操作系统特点可以将嵌入式操作系统分为()和分时操作系统,其中实时系统亦可分为()和软实时系统。 5、内核负责管理各个任务,或者为每个任务分配CPU时间,并且负责任务之间的(),内核的基本服务是()。 6、嵌入式开发一般采用()方式,其中宿主机一般是指()。 7、哈佛体系结构数据空间和地址空间(),ARM7TDMI采用()的内核架构,ARM920T采用()的内核架构。 采用()级流水线结构,ARM920TDMI采用()级流水线。 9.按操作系统的分类可知,Dos操作系统属于顺序执行操作系统,Unix 操作系统属于()操作系统,VxWorks属于()操作系统。 10、ARM7TDMI中,T表示支持16位Thumb指令集,D表示(),M表示内嵌乘法器Multiplier,I表示(),支持在线断点和调试。 二、选择题(请将答案填入题后括号中):共10小题,每小题2分,满分20分。 1、要使CPU能够正常工作,下列哪个条件不是处理器必须满足的。() (A)处理器的编译器能够产生可重入代码(B)在程序中可以找开或者关闭中断(C)处理器支持中断,并且能产生定时中断(D)有大量的存储空间 2、下面哪种操作系统最方便移植到嵌入式设备中。() (A)DOS (B)unix (C)Windowsxp (D)linux 3、下面哪个选项不是SUB设备的特点。() (A)串行通信方式(B)不可热拨插 (C)分HOST、DEVICE和HUB (D)通信速率比RS232快 4、下面哪种嵌入式操作系统很少用于手机终端设备上。() (A)Symbian (B)WinCE (C)uc/os (D)linux 5、以下哪项关于SRAM和DRAM的区别是不对。() (A)SRAM比DRAM慢(B)SRAM比DRAM耗电多 (C)DRAM存储密度比SRAM高得多(D)DRM需要周期性刷新 6、uc/os操作系统不包含以下哪几种状态。() (A)运行(B)挂起 (C)退出(D)休眠 7、0x07&0x11的运算结果是。() (A)0x01 (B)0x11 (C)0x17 (D)0x07 8、以下哪种方式不是uc/os操作系统中任务之间通信方式。() (A)信号量(B)消息队列 (C)邮件(D)邮箱 9、以下哪种方式不是文件系统的格式。() (A)FAT (B)DOS (C)NTFS (D)Ext 10、在将uc/os操作系统移植到ARM处理器上时,以下哪些文件不需要修改。() (A) (B) (C) (D)OSTaskInit 三、判断题:共5小题,每小题2分,满分10分。 1、所有的电子设备都属于嵌入式设备。() 2、冯诺依曼体系将被哈佛总线所取代。() 3、嵌入式linux操作系统属于免费的操作系统。() 4、移植操作系统时需要修改操作系统中与处理器直接相关的程序。() 5、的最大通信速率为12M/S。() 简答题:共2小题,每小题10分,满分20分。 1、根据嵌入式系统的特点,写出嵌入式系统的定义。 2、试分析实时操作系统的工作状态特点及相互之间的转换。

LInux嵌入式操作系统期末试题

简答题:请简单概括什么是嵌入式系统、并举出嵌入式系统的特点;(6分) 答: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统; 其特点如下: (1)嵌入式系统是面向特定系统应用的。 (2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等各个行业; 是一个技术密集、资金密集、高度分散、不断创新的知识集成系统; (3)嵌入式系统的硬件和软件都必须具有高度可定制性;只有这样才能适应嵌入式系统应用的需要,在产 品价格和性能方面具备竞争力; (4)嵌入式系统的生命周期相当长。 (5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。 嵌入式操作系统的优势:1.低成本开发系统 2.可应用多种硬件平台 3.可定制内核 4.性能优异 5.良好的网络支持 linux文件类型:1.普通文件2.目录文件3.链接文件4.设备文件a.块设备文件(硬盘:/dev/hda1)b.字符设备(串行端口接口设备) linux文件属性:访问权限:r:可读w:可写x:可执行用户级别:u:文件拥有者g:所属用户组o:其他用户第一个字符显示文件类型:- 普通 d 目录 l 链接… 简答题:(6分) linux目录结构:/bin 存放linux常用操作命令的执行文件(二进制文件) /boot 操作系统启动时所需要的程序 /dev Linux系统中使用的外部设备 /etc 系统管理时所需要的各种配置文件和子目录 /etc/rc.d Linux启动和关闭时要用到的脚本 /etc/rc.d/init Linux默认服务的启动脚本 /home 系统中默认用户工作根目录 /lib 存放系统动态链接共享库 /mnt软驱、光驱、硬盘的挂载点 /proc存放系统核心与执行程序所需信息、 /root超级用户登陆时的主目录 /sbin 存放管理员常用系统管理程序 /usr存放用户应用程序和文件 /var存放日志信息(答六点即可) 编写一个shell文件:创建studen01 –student30这30个用户,用户组为class1,之后编写shell文件,删除所有用户 操作步骤:1.打开Terminal(终端): 2.输入vi shell 3.输入i 进入编辑模式 4.输入 #!/bin/bash groupadd class1 for((i=1;i<10;i++)) do username=student0$i

嵌入式操作系统核原理开发(消息队列)

嵌入式操作系统内核原理和开发(消息队列) 消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入 式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者 都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已 满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以 把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量 和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了 方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节 上面。 首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的, 1typedef struct RAW_MSG_Q { 2 3 RAW_VOID **queue_start; /* Pointer to start of queue data */ 4 RAW_VOID **queue_end; /* Pointer to end of queue data */ 5 RAW_VOID **write; /* Pointer to where next message will be inserted in the Q */ 6 RAW_VOID **read; /* Pointer to where next message will be extracted from the Q */ 7 RAW_U32 size; /* Size of queue (maximum number of entries) */ 8 RAW_U32 current_numbers; /* Current number of entries in the queue */ 9 RAW_U16 blocked_send_task_numbers; /*number of blocked send task numbers */ 10 RAW_U16 blocked_receive_task_numbers; /*number of blocked send task numbers */ 11 12 } RAW_MSG_Q; 13 14typedef struct RAW_QUEUE 15 { 16 RAW_COMMON_BLOCK_OBJECT common_block_obj; 17 RAW_MSG_Q msg_q; 18 19 } RAW_QUEUE; 上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地

相关文档
最新文档