SYSTEM。C编写的51内核嵌入式微型操作系统。(最新整理)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

unsigned char KeyTemp; #define DataTemp KeyTemp #define Position KeyTemp if(!(Source & Source_SYS) || FVolume)
return; switch(Mode){ case SYS_TEST_MODE1:
VFD_All(CAllDigter); else
DisplayClock();
break; case SYS_EXIT_VOL:
if(Timer128ms) break;
if(FRecord && FPause){ Mode=(uchar)SYS_REC_ON; break;
} case SYS_POWER_ON_PRE:
* Name: * Input: * Output: * Function:
InitWorkMode() Slide switch status or Keyboard value WorkMode When system reset or power on, initial the WorkMode according to
Mute.byte1=0; Mute_Mode=1; FSource=0;
//When success switching this flag is set to 1
VFD_All(CAll); DisplayEQ(); FPower=1; Timer8ms=T8ms_SOURCE_POWER_EN;
3.3 软件模式切换示意图
Tunre Key Power Key (default) Power Key
CD key Open/Close key Power Key (if previous mode is CD)
CD
CD Key Tunre Key
Insert Power
CalKeyEvent Panel Key
//power on flag //WAIT 150MS
Mode=IDLE; Tuner_Off(); switch(SourceKey){
case IDLE: Source &= ~Source_SYS; break;
case K_TAPE:
Source=Source_TAPE; Source_LED=LED_Tape; break;
*
Slide switch status or Keyboard value.
* BeCalled: Sys_Mode() - Power on
*/
static void InitWorkMode(unsigned char SourceKey){ Power_On(); LS188_RESET=0; CD_DOOR=0;
break; case SYS_TEST_MODE4:
if(!Timer128ms){ Mode=(uchar)SYS_POWER_OFF_PRE;
break; } if(FTimer512ms)
VFD_String(DIG4,Str_EPROM); else
VFD_String(DIG4,Str_ERROR); break;
从定时的时间长度来看:定时时间从数十毫秒到数十秒不等,但基本可以分为两种数量级:小于一秒和
大于一秒。
一般来说这些用于控制系统工作的定时器不需要严格精确(允许 10%的误差)。
从执行的顺序来看可分为同时执行和顺序执行两种,其中顺序执行的定时器的可共用。考虑到系统中运
行的需要,特设定 3 个定时器可同时使用。
else{ if(Counter256ms==2) CD_Off();
}
//delay 256ms after reset ls188
break; } if(Timer8ms)
break; if(_testbit_(FPower)){
LS188_RESET=0; FDispPower=1;
//power off
Progress File
OPE Shanghai
Software Specification V 0.1
if(Timer128ms<=2)
Timer128ms=2; } if(!Timer128ms && !PWR_ENABLE){
//timer process and exited cd
Power_Off(); FDoTimerOK=0; } if(!FClockSet && !FTimer512ms)
会与 Timer64ms 有冲突的定时。
主要应用:各模式下的状态处理及键值处理。如 Radio 模式下,在自动搜索电台时设置 30 秒的定时。
3 系统工作模式
3.1 定义
系统软件的工作始终在各种模式之间切换。系统使用一个 16 位的字变量(WorkMode)控制各种工作模式。为
方便计算及简化处理,特将该变量的类型设计为 union,其具体定义如下:
Area=ReadByte(EEP_SYS_AREA); if(Area>3){
Area=0; WriteByte(Area,EEP_SYS_AREA); }
} else
WriteByte(Area,EEP_SYS_AREA); }
if(!FDoorMoveOK | tape_init_req){
5
VFD_All(DAll); Mode=(uchar)SYS_TEST_MODE2; DisplayMode=0; break;
//into SYS_TEST_MODE2
case SYS_TEST_MODE3: if(VFD_Shift(Str_EPROM,Str_CLEARED)) Mode=(uchar)SYS_POWER_OFF_PRE;
Test Mode MIC Vol ECHO
Tape
Power Key
Tape Key
Tuner
Tunre Key
Progress File
3
OPE Shanghai
Software Specification V 0.1
Progress File
实际的系统中‘开机过程’、‘关电待机模式’、‘测试模式’以及基本模式切换的工作都在函数 Sys_Mode()
VFD_All(CAll); Counter256ms=0; }
else Mode=(uchar)SYS_POWER_OFF;
break; case SYS_POWER_OFF:
DisplayMode=2; if(FDo_Init && !Timer8ms){
FDo_Init=0;
SYS_Init(); if(Area>3){
Initializtion vRaeltuuern&ksetyate Standby
Remote
Power Key
SYS_Key & SYS_Mode
Tape Key
Power Key (if the previous mode is Tape)
Timer Sleep Clock Volume REC Demo
case SYS_POWER_OFF_PRE: if(_testbit_(FDoorOpen)){ Door_Operation();
FDispDoor=0; Door_Mode=5; } if(FDispPower){
if(Timer128ms){
4
OPE Shanghai
Software Specification V 0.1
3.2 逻辑操作
根据上面的定义,当有按键操作并使基本工作模式改变时,通过调用函数 InitWorkMode(), 改变当前
WorkMode 的 设 置 , 根 据 键 码 重 新 定 义 成 规 定 的 值 , 比 如 从 CD Mode 改 变 为 Radio Mode, 使 用 语 句
WorkMode=SYS_RADIO; 并进行相应的初始化设置,即完成模式切换。
typedef union{
Word W;
Byte B[2];
}WordChar;
WordChar OS;
//can never be changed,MEMO
#define WorkMode OS.W
#define Source OS.B[0]
#define Mode OS.B[1]
为了使软件逻辑上的处理更加方便,对 WorkMode 的取值范围根据不同的工作模式设计了一些规则,在以 后的软件维护和升级时,可以在符合这些规则的前提下,增加新的工作模式定义。这些规则的基本思路是:
模式切换以后即进入基本模式初始化的处理流程。各基本模式(如:RADIO, CD, TAPE 等等)的详细介绍,,
请查阅相关文件。函数 InitWorkMode()的源程序如下:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
0x1000
1
OPE Shanghai
Software Specification V 0.1
Progress File
#define SYS_TAPE
0x2000
#define SYS_AUX
0x4000
Biblioteka Baidu
#define SYS_CD
0x8000
#define SYS
0x01ff //system common process
1、使用某些特定的位定义基本工作模式 2、在特定的基本工作模式下,定义可多达 256(1 个字节)种子工作模式。 3、在特定的基本工作模式下,子工作模式是唯一的。不同的基本工作模式下,子工作模式的取值可以相同。 4、通过简单的逻辑与、或就可以进行如上的处理。为此,定义如下
#define SYS_RADIO
2. 1 系统所使用的虚拟定时器
1. Timer8ms
以 8ms 为定时时基,即每 8ms 递减一次(Timer8ms>0),用于 1 秒以下的定时。
主要应用:1)Key Hold 状态下,5~10step/sec 定时操作。
2)在进行 Source 切换后,到进入 Playing 状态前的几种状态转换的定时。
2. Timer64ms
以 64ms 为定时时基,即每 64ms 递减一次(Timer64ms>0),用于 1 秒以上的定时。
主要应用:改变系统设置的键值处理,如 Volume 的显示延时及延时存储的定时。
3. Timer128ms
以 128ms 为定时时基,即每 128ms 递减一次(Timer128ms>0),用于 1 秒以 上的定时,用在可能
case K_CD: if(FDoorOpen){ FDoorOpen=0; Door_Operation();
Door_Mode=5;
2
OPE Shanghai
Software Specification V 0.1
} FDispDoor=0; case K_OPEN: Source=Source_CD; Source_LED=LED_CD; break; default: Source=Source_RADIO; Source_LED=LED_Tuner; break; } CD_Off(); }
OPE Shanghai
Software Specification V 0.1
Progress File
系统结构
1. 系统架构
本系统是采用分时处理的方式处理多个任务。各个组成模块能够在一定时间间隔内被循环调用,此结构的详
细说明,请查阅文件 MAIN.DOC.
2. 软件定时
系统工作时用到许多定时,这些定时具有如下特征:
if(FTimer512ms)
VFD_String(DIG4,Str_SLEEP); else
VFD_All(CAllDigter);
Counter256ms=0; break; } if(VFD_Shift(Str_BYE,Str_BYE)){
FDispPower=0; Mode=(uchar)SYS_POWER_OFF; }
中处理. 其源程序如下:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Name: Sys_Mode()
*
*/ unsigned int code DISPEQ_LAB[]={Str_POP,Str_CLASSIC,Str_ROCK,Str_JAZZ,Str_FLAT}; static void Sys_Mode(void){
相关文档
最新文档