(1)操作系统软件的代码不能太长
因为51系列单片机的系统硬件资源相对匮乏,如果操作系统的代码比应用程序的代码还大,甚至使得用户的应用程序要考虑给操作系统让出资源,这样的操作系统即使功能再完善,也不实用。现在流行的嵌入式操作系统就不能应用于51系列单片机,原因是代码太大。开发一个5000行的基于裸机的应用程序也就是占用 7~8KB ROM空间,一个操作系统用掉了几十KB,占空间不算,实时性的优势恐怕也没了(执行这么多的指令要时间)。所以,μCOS的作者也不支持将他的代码移植到51系列单片机上,这也就不奇怪了。
(2)操作系统不能占用太多的片内RAM空间
51系列单片机只有128个或者256个字节的片内RAM空间,稍微不注意就用完了。如果操作系统把片内的RAM使用得所剩无几,那用户的应用程序用什么? 如果说用户的程序可以把变量定义在片外RAM中的话,那么系统的硬件堆栈放在哪? 众所周知,51系列单片机的硬件堆栈不能放在片外,所以要在51系列单片机上开发操作系统的话就要少用它的片内RAM。但是不用片内RAM是办不到的,因为操作系统也要传递参数,也要使用堆栈。C51单片机的C函数传递参数是通过寄存器和存储器的,不能通过堆栈。但是可以通过一些措施使得操作系统代码少用片内RAM。
(3)解决好函数的重入问题
开发实时占先式的操作系统,可重入函数是非用不可的。可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间后又可以运行,而应用数据不会丢失。使得函数具有可重入性必须使得函数能够满足下列三个条件之一:
① 不使用共享资源;
② 在使用共享资源时关中断,使用完毕后再开中断;
③ 在使用共享资源时申请信号量,使用完后释放信号量。
这些条件在标准C中编程很容易实现,但是在Keil C51中就比较麻烦。因为标准C是把局部变量分配到用户堆栈中(动态分配),而Keil C51将局部变量分配到寄存器或内存固定地址(静态分配),并通过变量覆盖分析的方法,使多个函数的局部变量使用相同的内存地址以减少内存占用。在 Keil C51中,如果局部变量分配在寄存器中还好些,如果局部变量分配在内存中就比较麻烦。
(4)堆栈的分配问题
占先式操作系统的主要任务就是进行任务的调度,通过对任务的实时调度来完成系统的功能。任务调度过程中,不可避免的发生任务对系统资源的抢占问题,因为系统中 CPU只有一个,而每个任务都认为自己是CPU的绝对占用者,每一个任务都是一个死循环。任务间进行切换的依据就是各自的优先级,一个高优先级的任务可以通过任务调度函数或者中断退出函数等来中止正在运行的任务。被中断的任务只有自己的优先级在当前就绪任务表中最高时,才能从被中断处继续运行。这就需要为每个任务分配任务堆栈,来保存任务的环境变量。由于每个任务在不同时刻被中断时需要保存的环境变量数目不同,所以任务堆栈空间的分配问题也是一门学问。
关键字:51单片机 操作系统 RAM
引用地址:
开发51单片机操作系统应注意的问题
推荐阅读最新更新时间:2024-03-16 13:15
基于AT89S51单片机最小系统制作
一、 确定任务 开发单片机最小系统 二、任务分析: 该系统具有的功能: (1)具有2位LED数码管显示功能。 (2)具有八路发光二极管显示各种流水灯。 (3)可以完成各种奏乐,报警等发声音类实验。 (4)具有复位功能。 三、功能分析 (1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能; (2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能; (3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。 (4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部
[单片机]
51单片机故障分析一个
故障现象: 做了一个单片机温度监测系统,仿真机上一切正常,烧写芯片无法工作。 相关电路框图: 用51做处理器,外围电路如图,一片双积分转换芯片ICL7135做AD,它的时钟需要125K,用51的ALE经过一片CD4024分频得到。1403提供基准源。另外,一片7660提供7135工作所需要的负压。 为了省电,把所有模拟电路部分电源用一个晶体管管理起来,由P1.0来控制。(上图为示意图,省去了电阻没画)P1.0为地的时候,模拟系统才上电 现在怪现象如下: 仿真机正常运行,烧写芯片后无反应。 仿真正常,说明外围芯片完全正常,电路也没有错误。 经过检查,晶体正常,复位可靠,EA高,程序堆栈都没有溢出,并排除其
[单片机]
51单片机 动态数码管显示
本章博客写的内容主要围绕动态数码管显示,动态数码管显示与静态数码管显示比较稍有变化,主要在添加延时函数这点上 1.首先将上一章节使用子函数方法的代码复制过来 将Nixie( , )移到下方while循环中(因为要实现效果为动态的) void main() { while(1) { Nixie(1,1); Nixie(2,2); Nixie(3,3); } } 编译下载后效果为: 对于这种效果要进行消影的处理 因为单片机编译处理顺序是按照:位选 段选 (清零),位选 段选 ,位选 段选 由上一段的段选到下一部分的位选需要进行清零处理 接下来主要进行:增添延时函数和清零
[单片机]
基于Linux操作系统和S3C2410微处理器实现GPS实时导航系统的设计
定位系统自问世后便得到了蓬勃发展,其应用已渗入到各行各业。个人消费领域引领移动定位类型科技产品集中涌现,其他领域和行业也有大量技术更新。目前各领域的定位系统主要集中在平台和地图的研发上,平台配合应用要求选用硬件,地图根据显示要求实现软件算法。因而,它们在定位系统的研究工作中各成体系,兼容性不强。 近年来,在定位系统设计中,硬件选择越来越集中在几个品牌的几个型号上。而软件设计方面比较分散。因而在一个兼容性强的平台上实现软件的集中研发,将是未来的研发方向。 这里提出一种系统构造模式,弱化硬件平台的影响而力求最大限度的统一软件设计。 1 、系统整体设计方案 这里提出一种实用的设计方案,通过对系统的各方面配置,实现GPS实时导
[单片机]
老外Nexus 5X成砖寄去深圳:修好且升级到4G RAM
eeworld网晚间报道:为了弥补低配的遗憾,同时更省钱,现在民间兴起了改造手机内存的风潮,比如iPhone升级到大ROM,小米5升级6GB RAM等。据XDA的大神Cathair2906自曝,他成功将一部Nexus 5X手机从2GB RAM改造为4GB RAM。不过,其实并非Cathair2906自己动手而为。他说,这部Nexus 5X因为不开机找LG送修,结果官方拒保。无奈之下,他将手机送到了中国深圳。 老外Nexus 5X成砖寄去深圳:修好且升级到4G RAM 修理人员称,需要换CPU解决,而这颗骁龙808和RAM集成封装,于是,他建议不妨再升级下内存。 结果就是,Nexus 5X不仅满血复活,而且从2GB RAM升级
[手机便携]
51单片机串口通信需要加超时中断吗?
接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长 从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i;//声明标志位 flag uchar code table = I get void init() { TMOD=0x20;//设置T1定时器工作方式为2 8位初值自动重装的8位定时器 这里设置了两个计数器的工作方式 TH1=0xfd; /
[单片机]
51单片机之——外部中断0(INT0)
寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢? 寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址。换而言之,我们配置寄存器,便是给寄存器中赋予一定的值,而这些值又要与我们的目的想对应,这样它便会有相应的作用。 例如,芯片的资料规定,当给芯片的 A 寄存器赋“0x11”时,它会出现 B 现象;赋“0x77”时,它会出现 C 现象。那么当我们目的是完成 B 现象时,我们就只需要配置 A 寄存器为“0x11”即可。 虽说看起来很简单,并且去完成目的时的流程并非这么容易。但是,实实在在而言,这些就是控制寄存器的根本! 这里以外部中断0(
[单片机]
美光量产HBM3E高带宽内存 用于英伟达H200二季度出货
美光近日宣布已开始量产其 HBM3E 高带宽内存解决方案。英伟达 H200 Tensor Core GPU 将采用美光 8 层堆叠的 24GB 容量 HBM3E 内存,并于 2024 年第二季度开始出货。 美光 HBM3E 引脚速率超过 9.2Gb/s,提供超过1.2TB/s的内存带宽,美光 HBM3E 功耗比竞品低约 30%,美光 HBM3E 目前提供 24 GB 容量,使数据中心能够无缝扩展其人工智能应用。 此外,美光将于 2024 年3月出样12层堆叠的 36GB 容量 HBM3E,提供超过 1.2TB/s 的性能。同时,美光将赞助 3 月 18 日开幕的英伟达 GTC 全球人工智能大会,届时将分享更多前沿 AI 内存产品系
[半导体设计/制造]