51实时系统
RTX-51 Tiny
抢先任务切换
RTX51 Full 提供了抢先的任务切换,RTX51 Tiny 不具备这个功能。为了对多任务的概念有一个完整的了解,在这里对抢先任务切换加以解释。
在上一个例子中,任务1收到一个信号后不会立即开始,只有当任务0 发生了时间到事件后,任务1才会启动。如果任务1被赋予了比任务0 高的优先级,通过抢先任务切换,如果任务1收到了信号,就会立即开始。优先级在任务定义中被指定(默认的优先级是0)
抢先任务切换
RTX51 Full 提供了抢先的任务切换,RTX51 Tiny 不具备这个功能。为了对多任务的概念有一个完整的了解,在这里对抢先任务切换加以解释。
在上一个例子中,任务1收到一个信号后不会立即开始,只有当任务0 发生了时间到事件后,任务1才会启动。如果任务1被赋予了比任务0 高的优先级,通过抢先任务切换,如果任务1收到了信号,就会立即开始。优先级在任务定义中被指定(默认的优先级是0)
51规则看法
1.数据类型
C51 编译器支持下表列出的数据类型除了这些标量类型外还可以将变量组合到结构联合及
阵列中除了指明的类型可通过指针访问这些数据类型
当结果表示不同的数据类型时C51 编译器自动转换数据类型例如位变量在整数分配中就被转换成一个整数除了数据类型的转换之外带符号变量的符号扩展也是自动完成的。
2.存储器类型
C51 编译器支持8051 及其派生器件结构并提供对8051 所有存储区的访问每个变量可以明确地分配到指定的存储空间对内部数据存储器的访问比对外部数据存储器的访问快许多因此应当将频繁使用的变量放在内部数据存储器而把较少用的变量放在外部数据存储器中变量的定义包括了存储器类型的指定可以指定变量存放的位置存储器类型描述
3.再入函数
再入函数可以同时由几个程序共用当执行再入函数时其它程序可以中断执行并开始执行同一个再入函数通常C51 函数不能递归调用或用于导致重入的方式受到该限制是因为函数自变量和局部变量都存放在固定的存储器位置再入函数属性允许说明那些可以重入的函数因此可以实现递归调用例如
4.代码优化
C51 编译器是一个主动优化编译器意思是说编译器采取一定的步骤确定产生的代码和输出的目标文件是高效的代码编译器分析所产生的代码并使之成为最高效的指令序列这确保了C 程序在最小程序空间内实现尽可能高效的运行C51 编译器提供6 种不同级别的优化高级优化包含低级优化下面列出了C51 编译器可执行的所有优化
C51 编译器支持下表列出的数据类型除了这些标量类型外还可以将变量组合到结构联合及
阵列中除了指明的类型可通过指针访问这些数据类型
数据类型
位
字节
值的范围
bit 1 1 0~1
带符号char 8 1 -128~+127
无符号char 8 1 0~255
enum 16 2 -32768~+32767
short 16 2 -32768~+32767
short 16 2 0~65535
int 16 2 -32768~+32767
int 16 2 0~65535
long 32 4 -2147483648~+2147483647
long 32 4 0~4294967295
float 32 4 +1.175494E-38~+3.402823E+38
sbit 1 1 0~1
sfr 8 1 0~255
sfr16 16 2 0~65535
1). bit sbit sfrs 和sfr16 数据类型专门用于8051 硬件和C51 编译器并不是ANSI C 的一部分,不能通过指针进行访问bit sbit sfrs 和sfr16 数据类型用于访问8051 的特殊功能寄存器。例如:sfr P0 = 0x80 定义变量P0 并将其分配特殊功能寄存器地址0x80 在8051 上是P0 口的地址。
bit 1 1 0~1
带符号char 8 1 -128~+127
无符号char 8 1 0~255
enum 16 2 -32768~+32767
short 16 2 -32768~+32767
short 16 2 0~65535
int 16 2 -32768~+32767
int 16 2 0~65535
long 32 4 -2147483648~+2147483647
long 32 4 0~4294967295
float 32 4 +1.175494E-38~+3.402823E+38
sbit 1 1 0~1
sfr 8 1 0~255
sfr16 16 2 0~65535
当结果表示不同的数据类型时C51 编译器自动转换数据类型例如位变量在整数分配中就被转换成一个整数除了数据类型的转换之外带符号变量的符号扩展也是自动完成的。
2.存储器类型
C51 编译器支持8051 及其派生器件结构并提供对8051 所有存储区的访问每个变量可以明确地分配到指定的存储空间对内部数据存储器的访问比对外部数据存储器的访问快许多因此应当将频繁使用的变量放在内部数据存储器而把较少用的变量放在外部数据存储器中变量的定义包括了存储器类型的指定可以指定变量存放的位置存储器类型描述
code 程序存储器64K 字节通过操作码 MOVC @A+DPTR 进行访问
data 直接寻址内部数据存储器对变量的最快访问128 字节
idata 间接寻址内部数据存储器访问整个内部地址空间256 字节
bdata 位寻址内部数据存储器允许位和字节混合寻址16 字节
xdata 外部数据存储器64K 字节通过 MOVX @DPTR 访问
pdata 页外部数据存储器256 字节通过 MOVX @Rn 访问
data 直接寻址内部数据存储器对变量的最快访问128 字节
idata 间接寻址内部数据存储器访问整个内部地址空间256 字节
bdata 位寻址内部数据存储器允许位和字节混合寻址16 字节
xdata 外部数据存储器64K 字节通过 MOVX @DPTR 访问
pdata 页外部数据存储器256 字节通过 MOVX @Rn 访问
3.再入函数
再入函数可以同时由几个程序共用当执行再入函数时其它程序可以中断执行并开始执行同一个再入函数通常C51 函数不能递归调用或用于导致重入的方式受到该限制是因为函数自变量和局部变量都存放在固定的存储器位置再入函数属性允许说明那些可以重入的函数因此可以实现递归调用例如
int calc (char i, int b) reentrant
{
int x;
x=table [i]
return (x * b)
}
再入函数可以递归调用也可以同时被两个或更多程序调用它经常用于实时应用或中断代码和非中断代码必须共用一个函数的情况对于每个再入函数根据存储器的模型在内部或外部存储器模拟再入堆栈区。
{
int x;
x=table [i]
return (x * b)
}
4.代码优化
C51 编译器是一个主动优化编译器意思是说编译器采取一定的步骤确定产生的代码和输出的目标文件是高效的代码编译器分析所产生的代码并使之成为最高效的指令序列这确保了C 程序在最小程序空间内实现尽可能高效的运行C51 编译器提供6 种不同级别的优化高级优化包含低级优化下面列出了C51 编译器可执行的所有优化