Chinaunix首页 | 论坛 | 博客
  • 博客访问: 656590
  • 博文数量: 516
  • 博客积分: 4119
  • 博客等级: 上校
  • 技术积分: 4288
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 17:29
文章分类

全部博文(516)

文章存档

2014年(4)

2013年(160)

2012年(352)

分类:

2012-11-01 11:32:14

原文地址:软硬件编程模型 作者:Cheney-Xu

软硬件编程模型

 

硬件提供给软件的运行环境:

程序运行都需要程序计数器(PC)和堆栈指针寄存器(SP)以及一些辅助寄存器(如:程序状态寄存器等),pc用来指示当前正在运行的指令的下条指令的运行地址,sp用来在做程序跳转或中断时保存断点数据的存储地址的寄存器。

51单片机架构:

8051单片机的存储器管理采用哈佛结构,程序存储器rom,和数据存储器ram严格分开,

程序存储器用来存放用户程序和固定不变的数据表格(片内外统一编址,用movc指令访问),数据存储器用作工作区和存放临时数据(片内数据存储器用mov指令访问,片外用movx指令访问),对于普通的8051单片机,片内数据存储器RAM最大为256B,128B分为工作寄存器区,位寻址区,用户区和堆栈区四个区域,片内高128B为特殊功能寄存器区分布着堆栈指针,累加器等

X86架构:

8086对存储器进行分段管理,段寄存器CS存放代码段,DS存放数据段,ES存放附加数据段,SS存放堆栈段的段基址。一个源程序至少包含一个代码段

 

软件设计中要注意的问题:

1:对共享资源的保护

要对共享资源进行互斥访问

2:程序的可重入性问题

可重入函数或者只使用局部变量,即变量保存在CPU寄存器或堆栈中,或者要使用全局变量时,要对全局变量进行保护

3:临界代码段

临界代码段是指执行时不充许被打断的程序块,为达到这一要求,通常在进入临界代码段时关中断,退出时才开中断

 

实时内核的实现原理(以UC/OS为例):

1:多任务的实现

一个任务就是一个函数,任务用任务控制块来管理,并且每个任务配一个任务堆栈,任务切换时把任务的断点数据(包括当前PC值等一些辅助寄储器的值)保存到该任务的堆栈空间中,并把要运行的任务的断点数据恢复到CPU的寄存器中(但处理器一般没有提供PC的入栈和出栈指令,一般的做法是当前正在运行的任务通过中断和调用,执行任务切换函数,利用程序跳转会自动将PC值入栈,并在这个任务切换函数中将辅助寄存器的值也入栈,这些事情做好后,我们改变堆栈指针SP的指向,使其指向要运行的高优先级的任务的堆栈空间,然后进行出栈,然后进行子程序返加或中断返加,这时就发生的任务切换)UC/OS中任务调度器总是从就绪的任务选择最高优先级的任务来运行,正在运行的任务可以通过调用延时等其它函数使其处于等待状态从而让出CPU的使用权,这时调度器从就绪的任务选择最高优先级的任务来运行,并进任务切换,

2:中断

中断用于CPU处理异步事件

3:时钟节拍

UCOS内核中,每个时钟节拍到来时,都会引发时钟中断,在中断服务程序中,会将时钟节拍计数器加1,并把有延时的任务中的延时节拍数减1,时钟节拍的中断服务程序通常是用汇编语言来完成的。

4:内存管理

UCOS把连续的大块内存按分区来管理,每个分区中包含整数个大小相同的内存块。应用程序可以通过UCOS内核提供的API向内核申请、使用、并释放。

 

 

阅读(368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~