第1章
1、 什么是嵌入式系统?嵌入式系统的组成?
从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
从系统的角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统。
2、 典型的嵌入式处理器有哪些?
3、 典型的RTOS 操作系统有哪些?
4、 列举身边的嵌入式应用产品?
第2章 Cortex-M 体系结构
一题:填空题
1、 ARM Cortex系统的处理器分为:、、_____。
2、 ARM Cortex-M3为32位微控制器,请问32位指的是。
3、 ARM Cortex-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让
取指与数据访问并行进行。
4、 CM3寄存器分为寄存器,包括。和寄存器,包括异常屏蔽寄存器、控制寄存器。
5、 寄存器R13是。
6、 寄存器R14是程序连接寄存器。
7、 寄存器R15是。
8、 CM3的堆栈指针分为、。存储器堆栈堆栈分为:向上生长(即向高地
址方向生长)的递增堆栈;向下生长(即向低地址方向生长),称为递减堆栈。堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个数据项放入的空位置,称为空堆栈。试判断CM3属于递减堆栈堆栈和满堆栈堆栈。
9、 在CM3中记录程序状态的寄存器是。都分别有些什么状态断状态、可执状态。
10、 BASEPRI 寄存器的作用是。
11、 寄存器CONTROL 的作用。
MOV R0,#0x01
MSR CONTROL ,R0
在8级优先中,请问上述程序的功能是处理器工作在用户模式主堆栈下。
12、 CM3技持两个模式和两个特权级,它们分别是和模式;和用户级。
13、 处理器运行应用程序时,属于模式,即可以使用特权级,也可以使用用户级。
异常服务程序必在处理器模式下执行。复位后,处理器默认进入处理器模式,主堆栈。
14、 在用户级下设置的PSP=0x20000100,R0=0x01,R1=0x02。当执行
PUSH {R0-R1}
后,PSP=。
15、 CM3支持的4GB 存储空间被划分成:、、、、片外外设、内核私有6个区域。
16、 CM3中有一个位绑定区分别位于和片上外设区,其大小为,由
空间的位绑定别名区来访问。
17、 要将0x20000000单元的的第0位执1,请用位绑定的方式操作:
18、 CM3支持种系统异常,和
19、 CM3中的优先级理论是支持256级优先级,但芯片厂商是般只采用三位来设置,
比如像luminary 只支持___8____级优先级。
20、 在CM3中发生异常后,自动保存的寄存器是(按地址顺序填写):。
21、 异常向量表中,位于表头的是________。
22、 SysTick 是一个______位的系统定时器。通常的功能是_作为操作系统时钟__。
23、 异常返回进程堆栈三种功能。
二题 简答题
24、 请用汇编程序触发一次PendSV 系统异常。
答:LDR R4,=0xE000ED04 ; 中断控制及状态寄存器(地址:0xE000_ED04)第28
位置1表示挂起PendSV
LDR R5,=0x10000000
STR R5,[R4]
25、 请用汇编或C 代码启动SysTick 定时器,定时20ms 。
答:20ms 也即50Hz ,通常用于uC/OS-II操作系统中的时钟。以下程序是说明了在
任何时系统时钟下,都能产生20ms 的定时,有关系式如下:
在系统时钟下周期 定时器要计cnts 次才计到20ms
T =1 SysCtlClockGet ()
T *cnts =20ms
20ms cnts ==20ms *SysCtlClockGet ()T
#include
#define OS_TICKS_PER_SEC 50
#define NVIC_ST_RELOAD 0xE000E014 //重装值寄存器
#define NVIC_ST_CTRL 0xE000E010 //控制与状态寄存器
unsigned int cnts;
void SystickInit()
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
SysCtlClockSet(SYSCTL_XTAL_8MHZ|SYSCTL_SYSDIV_10| SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN ); // The crystal is 20MHz
HWREG(NVIC_ST_RELOAD)=cnts-1;
HWREG(NVIC_ST_CTRL)=(1 外部时钟,1-> 内部时钟
// bit1: 0->计满产生中断, 1->不产生中断
} // bit0: 0->不使能, 1-> 使能SysTick 计数器
第3章 指令系统
一题:填空题
26、 Thumb-2指令分为:。
27、 LDR 指令的作用是。STR 的作用是存器的中据存储到存储器中。
28、 当执行:LDR R0,=0x1234FFFF
BFC R0,#4,#10
请问:R0= 0x1234C00F 。
29、 当执行:LDR R0,=0x02
RBIT R1,R0
请问:R1= 0x40000000 。
30、 当执行:LDR R0,=0x02
CLZ R1,R0
请问:R1= 0x1E(30) 。
31、 已知R0=(8192),执行SSA T.W R1,#12,R0后,R1= 0x7FF(2047) 。
32、 已知R0=(33448899),执行REVSH R1,R0,R1= 0xFFFF9988 。
二题 简答题
33、 请用IT 指令优化下列C 代码。
if(R0==R1)
{
R3=R4+R5;
R3=R3/2;
}
else
{
R3=R6+R7;
R3=R3/2;
}
答: CMP R0, R1 ;比较R0和R1
ITTEE EQ ;如果 R0 == R1, Then-Then-Else-Else ADD EQ R3, R4, R5 ;相等时加法 ASR EQ R3, R3, #1 ;相等时算术右移 ADD NE R3, R6, R7 ;不等时加法 ASR NE R3, R3, #1 ;不等时算术右移
第4章 MDK 软件使用
一题 简答题
34、 RealView MDK的特点?
35、 如何书写信号函数?
第5章 ARM Cortex_M3微控制器
一 填空题
LM3S 微控制器的片上资源有2。
1. Stellaris 微控制器提供一个集成的LDO 稳压电源,电压调节范围是:。
2. Stellaris 微控制器通常情况下有时钟输出。
3. 睡眠模式指的是同。
4. 深度睡眠模式指的是内核和存储器都不工作,外设可以正常工作, 系统时钟只能使用主振荡器。
5. Stellaris 微控制器系统需要V 的电源供电。
6. Stellaris 微控制器的每一个I/O口都可用于、、等功能。
7. LM3S 的定时器包含4个GPTM 模块,可工作于位定时模式,位输入捕获
模式,16位PWM 模式。
8. MCS-51单片机中的16位定时器属于加1计数模式,LM3S 微控制器的GPTM 属于
减1计数模式。
9. LM3S 的串口功能有_、_两种主功能。
10. LM3S 的ADC 模块是属于A/D转换器。最大转换频率为。工作时采用于序列采样方式使一次可以完成多路模拟量的采集。
二 简答题
11. Stellaris 微控制器内部和外部的晶振频率范围是多少?使用PLL 功能时的工作频率是
多少?
答:内部采用12MHz 时种,外部采用0~8MHz,PLL 工作可以将低频时钟倍频到200MHz 。
12. 请利用库函数设置外部晶振8MHz ,利PLL 后,让系统内核时钟为20MHz 。 答:
SysCtlClock(SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN|SYSCTL_USE_PLL|SYSCTL_SYSDIV_10)
13. 请利用库函数设置处理器进入睡眠模式,并说明如何退出睡眠模式?
答:进入睡眠模式:SysCtlSleep()
退出睡眠模式:任何一个中断都可以使进入睡眠状的处理器退出睡眠模式。
14. 操作定时器让开发板上的4只LED 软流流发光,其亮灭时间为0.5s 。
发光二极管电路原理如图所示,系统时钟采用外接6MHz, 先进行预分频100,变成频率为60000Hz, 周期为11(s ) , 再计数30000次(x 30000(s ) 0. 5s )。
6000060000
代码:
主程序:时种配置、外围模块的使能、定时器0设置成16位周期定时,预分频100,初值为30000。 void main()
{
SysCtlClockSet(SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ |SYSCTL_SYSDIV_1); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); //使能B 口
GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); //管脚输出 SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); //使能Timer0模块
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |TIMER_CFG_A_PERIODIC); //16位周期定时 TimerPrescaleSet(TIMER0_BASE, TIMER_A, 99); //预先进行100分频(6M/100)=60000
TimerLoadSet(TIMER0_BASE, TIMER_A, 30000);// 设置Timer 初值,定时500ms
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //使能Timer 超时中断
IntEnable(INT_TIMER0A); // 使能Timer 中断
IntMasterEnable(); //使能处理器中断
TimerEnable(TIMER0_BASE, TIMER_A); //使能Timer 计数
while(1){;} //循环
}
中断服务程序:间隔0.5s ,PB1、PB4、PB5、PB6依次输出1,点亮四只发光二极管。
void Timer0A_ISR(void)
{
unsigned char i;
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态
TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要
switch (i)
{
case 0:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X02); break;
case 1:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X10); break;
case 2:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X20); break;
case 3:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X40); break;}
i++;
if(i==4)
{i=0}
}
15. 编写程序实现将开发板上的A/D模块采集到的电压数据用串行通信口送到PC 机,PC
机通过串口调式精灵或超级终端端观看数据。
答:
1、首先结ADC 、UART 进行实始化(ADC 的序列方式、采样频率、通道数、触发深度等等;UART 的波特率、数据位、校验等等)。
2、启动A/D转换(处理器触发、比较器触发、PWM 触发、定时器触发、PB4触发) 。
3、等待A/D转换结束,并取出数据。
4、A/D转换后的数据写入UART 数据寄存器,启动UART 发送。
5、等待发送给束。
6、重新进行第二次A/D转换并发送。
void uartInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // 使能UART 模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 使能RX/TX所在的GPIO 端口
UARTConfigSet(UART0_BASE, // 配置UART 端口
115200, // 波特率:9600
UART_CONFIG_WLEN_8 | // 数据位:8
UART_CONFIG_STOP_ONE | // 停止位:1
UART_CONFIG_PAR_NONE); // 校验位:无
UARTEnable(UART0_BASE); // 使能UART 端口
}
void adcInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // 使能ADC 模块的时钟
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //125KSps采样率
ADCSequenceDisable(ADC_BASE, 0); //禁能所有采样序列
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); //采样序列0为处理器触发, 优先级为0
ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_END); //样序列0的第0步使用ADC0通道, 完成第0步后结束
ADCSequenceEnable(ADC_BASE, 0); // 使能采样序列0
}
Include >
#define HWREG(x) (*((volatile unsigned long *)(x)))
#define UART0_DATA 0x4000C000
#define UART0_FLAG 0x4000C018 /*UART标置寄存器*/
V oid main()
{
unsigned int ulData;
uartInit();
adcInit();
while(1)
{
ADCProcessorTrigger(ADC_BASE, 0); //处理器触发采样序列0
while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) );
// 等待FIFO 0为非空,即等待转换结束
ADCSequenceDataGet(ADC_BASE, 0, &ulData); //读出10位转换结果
ulData = (ulData * 1000 * 3.3) / 1024; //换算成真实电压值,单位mV
HWREG(UART0_DATA)=ulData; //数据发给你串口
while((HWREG(UART0_FLAG)&0x8)); //检测发送完毕
}
} GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 配置RX/TX所在管脚为
16. 编程实现SSI 驱动8位数码管显示,并显示0、1、2、3、4、5、6、7,结合RTC 显
示实时时钟。
答:
程序代码:
#include 《lm3sxxxx.h 》
#define BitRate 115200 //设定波特率
#define DataWidth 16 //16位宽
unsigned char dispBuf[8]; // 定义显示缓冲区
unsigned short DISP_TAB[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //段码
const unsigned char DigTab[8] = {0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08 }; // 定义数码管位选数据 int main (void)
{
unsigned char n=0;
unsigned short t;
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); //为SSI 提供时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //为GPIOA 端口提供时钟
/* 设置SPI 为主机模式0,16位数据宽度,115200的波特率*/
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth); SSIEnable(SSI_BASE); // 使能SPI
/* 设定 GPIO A 2~5 引脚为使用外设功能*/
GPIOPinTypeSSI(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5)); //设置SSI 管脚
while (1) {
for (n=0; n
t = DigTab[n]; // 获取位选数据
t
t |= DISP_TAB[dispBuf[n]];; // 段选数据放在低8位
SSIDataPut(SSI_BASE, t); // 输出数据,共16个有效位
}
} //SysCtlDelay(20 * (TheSysClock / 3000)); }
17. 编程用PWM 实现直流电机转速控制。
答:
/******************************************************************************************* LM3S 系列PWM 例程:在PB0/PWM2和PB1/PWM3管脚产生占空比不同的PWM 方波
*******************************************************************************************/ #include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "pwm.h"
#define PB0_PWM2 GPIO_PIN_0
#define PB1_PWM3 GPIO_PIN_1
int main (void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //使能PWM2和PWM3输出所在GPIO SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); //使能PWM 模块
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); //PWM时钟配置:不分频
GPIOPinTypePWM(GPIO_PORTB_BASE, (GPIO_PIN_0 | GPIO_PIN_1)); //PB0和PB1配置为PWM 功能
PWMGenConfigure(PWM_BASE, PWM_GEN_1, //配置PWM 发生器1:加减计数 PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 6000); //设置PWM 发生器1的周期 PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 4200); //设置PWM2输出的脉冲宽度 PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 2100); // 设置PWM3输出的脉冲宽度
PWMOutputState(PWM_BASE, (PWM_OUT_2_BIT | PWM_OUT_3_BIT), true); //使能PWM2和PWM3的输出
PWMGenEnable(PWM_BASE, PWM_GEN_1); // 使能PWM 发生器1, 开始产生PWM 方波 for (;;) {
}
}
第6章 指令系统
一题:填空题
1、 μC/OS-II操作系统的文件结构可分成三部分:与处理器类型无关的代码、与处理器类型有关的代码、与应用程序配置有关的代码。
2、 μC/OS-II操作系统中与处理器无关的代码有:。
3、 μC/OS-II操作系统中与处理器有关的代码有:
4、 从任务的存储结构来看,μC/OS-II的任务由三大要素是:、、
控制块。
5、 μC/OS-II中创建任务的函数是:。
6、 μC/OS-II中任务延时函数分别是:、 。
7、 μC/OS-II中的任务在运行中的五种状态:等待状态、睡眠态、就绪态、运行态、被中断态。
8、 μC/OS-II中任务的调度原则是:。具本算法是通过两个变
量(OSRdyGrp 、OSRdyTbl[])+两张表(OSMapTbl[]、OSUnMaTbl[])相互查找来完成的。
9、 μC/OS-II中任务的初始化函数是;任务的启动函数是。
10、 在编写μC/OS-II的中断服务程序时,要用到两个重要的函数和OSIntExit()。
11、 时钟节拍函数是:。
12、 μC/OS-II中任务与任务之间的通信方式有:消息队列。
13、 μC/OS-II中信号量的创建函数是;信号量的请求函数是()。信号量的释放函数是OSSemPost ()。
二题 简答题
14、 μC/OS-II移植的条件?
要使µC/OS-Ⅱ正常运行,处理器必须满足以下要求:
1. 处理器的C 编译器能产生可重入代码。
2. 用C 语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在10至100Hz 之间) 。
4. 处理器支持能够容纳一定量数据(可能是几千字节) 的硬件堆栈。
5. 处理器有将堆栈指针和其它CPU 寄存器读出和存储到堆栈或内存中的指令。
15、 μC/OS-II移植的内容?
移植的内容主要是完善OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三个文件。 移植具体工作包括以下几个内容:
● ● 声明10个数据类型(OS_CPU.H)
● ● 用C 语言编写十个简单的函数(OS_CPU_C.C)
● 16、 请Thumb-2的RBIT 、CLZ 、IT 等指令对μC/OS-II的任务调度算法进行优化。
17、 请编程实现通过LM3S8962的串口输出10个“A ”和10个“B ”,分别由两个任务完
成(MyTask 输出“A ”,所需堆栈为50个字节,优先级为1;YouTask 输出“B ”,所需堆栈为50个字节,优先级为2),已完成除主函数外的所有代码编写,请在μC/OS-II下完成主程序代码。
答:
#include // 预处理文件
#define TASK_My_STK_SIZE 50 // 两个任务堆栈大小
#define TASK_You_STK_SIZE 50
static OS_STK MyTask_Stk[TASK_My_STK_SIZE-1]; // 堆栈空间
static OS_STK YouTask_Stk[TASK_My_STK_SIZE-1];
static void MyTask(void *parg); // 原型声明
static void YouTask(void *parg);
int main (void)
{
OSInit(); // OS-II 初始化uC/OS-II的内核 OSTaskCreate (MyTask,0,
&MyTask_Stk[TASK_My_STK_SIZE-1],
1); // 创建mytask 任务
OSTaskCreate (YouTask, 0,
&YouTask_Stk[TASK_You_STK_SIZE-1],
2); // 创建youtask 任务
OSStart(); // uC/OS-II 启动uC/OS-II return(0) ;
}
18、 如图所示,为高效DC-DC 数控恒流源结构框图,输入电压Ui=15V,输出电流Io :
200~2000mA连续可调,请简述其工作原理。
答:工作原理:系统用LM3S615为主控制器,通过内部PWM 模块输出20KHz 脉冲波,通过调节占空比来驱动DC-DC 中的开关管,以达到恒定的电流输出;输出部分通过取样电路采集输出电流、电压参数,由微控制器处理,再微调输出参数,达到反馈控制,以输出不同电流;系统实时监控,具有过压保护功能,排除过压故障后,电源能自动恢复为正常状态。
19、 如图所示,单片机PB0去控制LED 显示,PB1去控制蜂鸣器。由两个任务:Taskled 、
Taskbuz 完成控制。Taskled 任务完成LED 灯的闪烁间隔1S 亮一次。Taskbuz 任务完成蜂鸣器发声,间隔1S 叫一次。现已完成两个任务代码的编写和目标板初始化代码(targetInit())的编写如代码所示,要求用uc/os-II操作系统管里完成主程序。
答:#include
/***************** TASK PRIORITIES 任务优先级**************************/ #define TASK_Led_PRIO 1
#define TASK_Buz_PRIO 5 /***************** TASK STACK SIZES 任务堆栈大小**********************/ #define TASK_Led_STK_SIZE 50
#define TASK_Buz_STK_SIZE 50
/******************* CONSTANTS 常量************************************/ #define LED_SYSCTL SYSCTL_PERIPH_GPIOB /* System control of LED1 */ #define LED_GPIO_PORT GPIO_PORTB_BASE /* IO port of LED1 */ #define LED_PIN GPIO_PIN_0 /* Pin number of LED1 */ #define BUZ_SYSCTL SYSCTL_PERIPH_GPIOB /* System control of the buzzer */ #define BUZ_GPIO_PORT GPIO_PORTB_BASE /* IO port of the buzzer */ #define BUZ_PIN GPIO_PIN_1 /* Pin number of the buzzer */ /********************** VARIABLES 变量*********************************/ static OS_STK TaskLed_Stk[TASK_Led_STK_SIZE]; /* The stack of start task */ static OS_STK TaskBuz_Stk[TASK_Buz_STK_SIZE]; /* 启动任务的堆栈 */ /**************************函数声明**************************************/ static void TaskLed(void *parg);
static void TaskBuz(void *parg);
void ledToggle (void) ;
void buzToggle (void) ;
/***************** TaskLed ,驱动LED 闪烁, 间隔1S 亮一次。****************/ static void TaskLed (void *parg)
{
parg=parg;
targetInit(); /* 初始化目标单片机 while(1)
{
*/
ledToggle();
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
/************ TaskBuz ,驱动蜂鸣器,间隔1S 叫一次。*************************/ static void TaskBuz (void *parg)
{
parg=parg;
while(1)
{
buzToggle ();
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
/********************************取反LED 操作****************************/ void ledToggle (void)
{
GPIOPinWrite(LED_GPIO_PORT, LED_PIN, ~GPIOPinRead(LED_GPIO_PORT, LED_PIN));
}
/********************************取反蜂鸣器操作**************************/ void buzToggle (void)
{
GPIOPinWrite(BUZ_GPIO_PORT, BUZ_PIN, ~GPIOPinRead(BUZ_GPIO_PORT, BUZ_PIN));
}
/*********************************主程序 *************************************/ int main (void)
{
intDisAll(); /* 关闭所有中断 */ OSInit(); /* OS-II 初始化uC/OS-II的内核 */ OSTaskCreate (TaskLed, 0,
&TaskLed_Stk[TASK_Led_STK_SIZE-1],
TASK_Led_PRIO) ; /* 创建TaskLed 任务 */ OSTaskCreate (TaskBuz, 0,
&TaskBuz_Stk[TASK_Led_STK_SIZE-1],
TASK_Buz_PRIO); /* 创建TaskBuz 任务 */
OSStart(); /* Start uC/OS-II 启动uC/OS-II */ return(0) ;
}
/*****************************************END********************************/
第1章
1、 什么是嵌入式系统?嵌入式系统的组成?
从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
从系统的角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统。
2、 典型的嵌入式处理器有哪些?
3、 典型的RTOS 操作系统有哪些?
4、 列举身边的嵌入式应用产品?
第2章 Cortex-M 体系结构
一题:填空题
1、 ARM Cortex系统的处理器分为:、、_____。
2、 ARM Cortex-M3为32位微控制器,请问32位指的是。
3、 ARM Cortex-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让
取指与数据访问并行进行。
4、 CM3寄存器分为寄存器,包括。和寄存器,包括异常屏蔽寄存器、控制寄存器。
5、 寄存器R13是。
6、 寄存器R14是程序连接寄存器。
7、 寄存器R15是。
8、 CM3的堆栈指针分为、。存储器堆栈堆栈分为:向上生长(即向高地
址方向生长)的递增堆栈;向下生长(即向低地址方向生长),称为递减堆栈。堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个数据项放入的空位置,称为空堆栈。试判断CM3属于递减堆栈堆栈和满堆栈堆栈。
9、 在CM3中记录程序状态的寄存器是。都分别有些什么状态断状态、可执状态。
10、 BASEPRI 寄存器的作用是。
11、 寄存器CONTROL 的作用。
MOV R0,#0x01
MSR CONTROL ,R0
在8级优先中,请问上述程序的功能是处理器工作在用户模式主堆栈下。
12、 CM3技持两个模式和两个特权级,它们分别是和模式;和用户级。
13、 处理器运行应用程序时,属于模式,即可以使用特权级,也可以使用用户级。
异常服务程序必在处理器模式下执行。复位后,处理器默认进入处理器模式,主堆栈。
14、 在用户级下设置的PSP=0x20000100,R0=0x01,R1=0x02。当执行
PUSH {R0-R1}
后,PSP=。
15、 CM3支持的4GB 存储空间被划分成:、、、、片外外设、内核私有6个区域。
16、 CM3中有一个位绑定区分别位于和片上外设区,其大小为,由
空间的位绑定别名区来访问。
17、 要将0x20000000单元的的第0位执1,请用位绑定的方式操作:
18、 CM3支持种系统异常,和
19、 CM3中的优先级理论是支持256级优先级,但芯片厂商是般只采用三位来设置,
比如像luminary 只支持___8____级优先级。
20、 在CM3中发生异常后,自动保存的寄存器是(按地址顺序填写):。
21、 异常向量表中,位于表头的是________。
22、 SysTick 是一个______位的系统定时器。通常的功能是_作为操作系统时钟__。
23、 异常返回进程堆栈三种功能。
二题 简答题
24、 请用汇编程序触发一次PendSV 系统异常。
答:LDR R4,=0xE000ED04 ; 中断控制及状态寄存器(地址:0xE000_ED04)第28
位置1表示挂起PendSV
LDR R5,=0x10000000
STR R5,[R4]
25、 请用汇编或C 代码启动SysTick 定时器,定时20ms 。
答:20ms 也即50Hz ,通常用于uC/OS-II操作系统中的时钟。以下程序是说明了在
任何时系统时钟下,都能产生20ms 的定时,有关系式如下:
在系统时钟下周期 定时器要计cnts 次才计到20ms
T =1 SysCtlClockGet ()
T *cnts =20ms
20ms cnts ==20ms *SysCtlClockGet ()T
#include
#define OS_TICKS_PER_SEC 50
#define NVIC_ST_RELOAD 0xE000E014 //重装值寄存器
#define NVIC_ST_CTRL 0xE000E010 //控制与状态寄存器
unsigned int cnts;
void SystickInit()
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
SysCtlClockSet(SYSCTL_XTAL_8MHZ|SYSCTL_SYSDIV_10| SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN ); // The crystal is 20MHz
HWREG(NVIC_ST_RELOAD)=cnts-1;
HWREG(NVIC_ST_CTRL)=(1 外部时钟,1-> 内部时钟
// bit1: 0->计满产生中断, 1->不产生中断
} // bit0: 0->不使能, 1-> 使能SysTick 计数器
第3章 指令系统
一题:填空题
26、 Thumb-2指令分为:。
27、 LDR 指令的作用是。STR 的作用是存器的中据存储到存储器中。
28、 当执行:LDR R0,=0x1234FFFF
BFC R0,#4,#10
请问:R0= 0x1234C00F 。
29、 当执行:LDR R0,=0x02
RBIT R1,R0
请问:R1= 0x40000000 。
30、 当执行:LDR R0,=0x02
CLZ R1,R0
请问:R1= 0x1E(30) 。
31、 已知R0=(8192),执行SSA T.W R1,#12,R0后,R1= 0x7FF(2047) 。
32、 已知R0=(33448899),执行REVSH R1,R0,R1= 0xFFFF9988 。
二题 简答题
33、 请用IT 指令优化下列C 代码。
if(R0==R1)
{
R3=R4+R5;
R3=R3/2;
}
else
{
R3=R6+R7;
R3=R3/2;
}
答: CMP R0, R1 ;比较R0和R1
ITTEE EQ ;如果 R0 == R1, Then-Then-Else-Else ADD EQ R3, R4, R5 ;相等时加法 ASR EQ R3, R3, #1 ;相等时算术右移 ADD NE R3, R6, R7 ;不等时加法 ASR NE R3, R3, #1 ;不等时算术右移
第4章 MDK 软件使用
一题 简答题
34、 RealView MDK的特点?
35、 如何书写信号函数?
第5章 ARM Cortex_M3微控制器
一 填空题
LM3S 微控制器的片上资源有2。
1. Stellaris 微控制器提供一个集成的LDO 稳压电源,电压调节范围是:。
2. Stellaris 微控制器通常情况下有时钟输出。
3. 睡眠模式指的是同。
4. 深度睡眠模式指的是内核和存储器都不工作,外设可以正常工作, 系统时钟只能使用主振荡器。
5. Stellaris 微控制器系统需要V 的电源供电。
6. Stellaris 微控制器的每一个I/O口都可用于、、等功能。
7. LM3S 的定时器包含4个GPTM 模块,可工作于位定时模式,位输入捕获
模式,16位PWM 模式。
8. MCS-51单片机中的16位定时器属于加1计数模式,LM3S 微控制器的GPTM 属于
减1计数模式。
9. LM3S 的串口功能有_、_两种主功能。
10. LM3S 的ADC 模块是属于A/D转换器。最大转换频率为。工作时采用于序列采样方式使一次可以完成多路模拟量的采集。
二 简答题
11. Stellaris 微控制器内部和外部的晶振频率范围是多少?使用PLL 功能时的工作频率是
多少?
答:内部采用12MHz 时种,外部采用0~8MHz,PLL 工作可以将低频时钟倍频到200MHz 。
12. 请利用库函数设置外部晶振8MHz ,利PLL 后,让系统内核时钟为20MHz 。 答:
SysCtlClock(SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN|SYSCTL_USE_PLL|SYSCTL_SYSDIV_10)
13. 请利用库函数设置处理器进入睡眠模式,并说明如何退出睡眠模式?
答:进入睡眠模式:SysCtlSleep()
退出睡眠模式:任何一个中断都可以使进入睡眠状的处理器退出睡眠模式。
14. 操作定时器让开发板上的4只LED 软流流发光,其亮灭时间为0.5s 。
发光二极管电路原理如图所示,系统时钟采用外接6MHz, 先进行预分频100,变成频率为60000Hz, 周期为11(s ) , 再计数30000次(x 30000(s ) 0. 5s )。
6000060000
代码:
主程序:时种配置、外围模块的使能、定时器0设置成16位周期定时,预分频100,初值为30000。 void main()
{
SysCtlClockSet(SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ |SYSCTL_SYSDIV_1); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); //使能B 口
GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); //管脚输出 SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); //使能Timer0模块
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |TIMER_CFG_A_PERIODIC); //16位周期定时 TimerPrescaleSet(TIMER0_BASE, TIMER_A, 99); //预先进行100分频(6M/100)=60000
TimerLoadSet(TIMER0_BASE, TIMER_A, 30000);// 设置Timer 初值,定时500ms
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //使能Timer 超时中断
IntEnable(INT_TIMER0A); // 使能Timer 中断
IntMasterEnable(); //使能处理器中断
TimerEnable(TIMER0_BASE, TIMER_A); //使能Timer 计数
while(1){;} //循环
}
中断服务程序:间隔0.5s ,PB1、PB4、PB5、PB6依次输出1,点亮四只发光二极管。
void Timer0A_ISR(void)
{
unsigned char i;
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true); // 读取中断状态
TimerIntClear(TIMER0_BASE, ulStatus); // 清除中断状态,重要
switch (i)
{
case 0:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X02); break;
case 1:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X10); break;
case 2:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X20); break;
case 3:GPIOPinWrite(GPIO_PORTB_BASE,0XFF, 0X40); break;}
i++;
if(i==4)
{i=0}
}
15. 编写程序实现将开发板上的A/D模块采集到的电压数据用串行通信口送到PC 机,PC
机通过串口调式精灵或超级终端端观看数据。
答:
1、首先结ADC 、UART 进行实始化(ADC 的序列方式、采样频率、通道数、触发深度等等;UART 的波特率、数据位、校验等等)。
2、启动A/D转换(处理器触发、比较器触发、PWM 触发、定时器触发、PB4触发) 。
3、等待A/D转换结束,并取出数据。
4、A/D转换后的数据写入UART 数据寄存器,启动UART 发送。
5、等待发送给束。
6、重新进行第二次A/D转换并发送。
void uartInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // 使能UART 模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 使能RX/TX所在的GPIO 端口
UARTConfigSet(UART0_BASE, // 配置UART 端口
115200, // 波特率:9600
UART_CONFIG_WLEN_8 | // 数据位:8
UART_CONFIG_STOP_ONE | // 停止位:1
UART_CONFIG_PAR_NONE); // 校验位:无
UARTEnable(UART0_BASE); // 使能UART 端口
}
void adcInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // 使能ADC 模块的时钟
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //125KSps采样率
ADCSequenceDisable(ADC_BASE, 0); //禁能所有采样序列
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); //采样序列0为处理器触发, 优先级为0
ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_END); //样序列0的第0步使用ADC0通道, 完成第0步后结束
ADCSequenceEnable(ADC_BASE, 0); // 使能采样序列0
}
Include >
#define HWREG(x) (*((volatile unsigned long *)(x)))
#define UART0_DATA 0x4000C000
#define UART0_FLAG 0x4000C018 /*UART标置寄存器*/
V oid main()
{
unsigned int ulData;
uartInit();
adcInit();
while(1)
{
ADCProcessorTrigger(ADC_BASE, 0); //处理器触发采样序列0
while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) );
// 等待FIFO 0为非空,即等待转换结束
ADCSequenceDataGet(ADC_BASE, 0, &ulData); //读出10位转换结果
ulData = (ulData * 1000 * 3.3) / 1024; //换算成真实电压值,单位mV
HWREG(UART0_DATA)=ulData; //数据发给你串口
while((HWREG(UART0_FLAG)&0x8)); //检测发送完毕
}
} GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 配置RX/TX所在管脚为
16. 编程实现SSI 驱动8位数码管显示,并显示0、1、2、3、4、5、6、7,结合RTC 显
示实时时钟。
答:
程序代码:
#include 《lm3sxxxx.h 》
#define BitRate 115200 //设定波特率
#define DataWidth 16 //16位宽
unsigned char dispBuf[8]; // 定义显示缓冲区
unsigned short DISP_TAB[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //段码
const unsigned char DigTab[8] = {0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08 }; // 定义数码管位选数据 int main (void)
{
unsigned char n=0;
unsigned short t;
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); //为SSI 提供时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //为GPIOA 端口提供时钟
/* 设置SPI 为主机模式0,16位数据宽度,115200的波特率*/
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth); SSIEnable(SSI_BASE); // 使能SPI
/* 设定 GPIO A 2~5 引脚为使用外设功能*/
GPIOPinTypeSSI(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5)); //设置SSI 管脚
while (1) {
for (n=0; n
t = DigTab[n]; // 获取位选数据
t
t |= DISP_TAB[dispBuf[n]];; // 段选数据放在低8位
SSIDataPut(SSI_BASE, t); // 输出数据,共16个有效位
}
} //SysCtlDelay(20 * (TheSysClock / 3000)); }
17. 编程用PWM 实现直流电机转速控制。
答:
/******************************************************************************************* LM3S 系列PWM 例程:在PB0/PWM2和PB1/PWM3管脚产生占空比不同的PWM 方波
*******************************************************************************************/ #include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "pwm.h"
#define PB0_PWM2 GPIO_PIN_0
#define PB1_PWM3 GPIO_PIN_1
int main (void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //使能PWM2和PWM3输出所在GPIO SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); //使能PWM 模块
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); //PWM时钟配置:不分频
GPIOPinTypePWM(GPIO_PORTB_BASE, (GPIO_PIN_0 | GPIO_PIN_1)); //PB0和PB1配置为PWM 功能
PWMGenConfigure(PWM_BASE, PWM_GEN_1, //配置PWM 发生器1:加减计数 PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 6000); //设置PWM 发生器1的周期 PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 4200); //设置PWM2输出的脉冲宽度 PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 2100); // 设置PWM3输出的脉冲宽度
PWMOutputState(PWM_BASE, (PWM_OUT_2_BIT | PWM_OUT_3_BIT), true); //使能PWM2和PWM3的输出
PWMGenEnable(PWM_BASE, PWM_GEN_1); // 使能PWM 发生器1, 开始产生PWM 方波 for (;;) {
}
}
第6章 指令系统
一题:填空题
1、 μC/OS-II操作系统的文件结构可分成三部分:与处理器类型无关的代码、与处理器类型有关的代码、与应用程序配置有关的代码。
2、 μC/OS-II操作系统中与处理器无关的代码有:。
3、 μC/OS-II操作系统中与处理器有关的代码有:
4、 从任务的存储结构来看,μC/OS-II的任务由三大要素是:、、
控制块。
5、 μC/OS-II中创建任务的函数是:。
6、 μC/OS-II中任务延时函数分别是:、 。
7、 μC/OS-II中的任务在运行中的五种状态:等待状态、睡眠态、就绪态、运行态、被中断态。
8、 μC/OS-II中任务的调度原则是:。具本算法是通过两个变
量(OSRdyGrp 、OSRdyTbl[])+两张表(OSMapTbl[]、OSUnMaTbl[])相互查找来完成的。
9、 μC/OS-II中任务的初始化函数是;任务的启动函数是。
10、 在编写μC/OS-II的中断服务程序时,要用到两个重要的函数和OSIntExit()。
11、 时钟节拍函数是:。
12、 μC/OS-II中任务与任务之间的通信方式有:消息队列。
13、 μC/OS-II中信号量的创建函数是;信号量的请求函数是()。信号量的释放函数是OSSemPost ()。
二题 简答题
14、 μC/OS-II移植的条件?
要使µC/OS-Ⅱ正常运行,处理器必须满足以下要求:
1. 处理器的C 编译器能产生可重入代码。
2. 用C 语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在10至100Hz 之间) 。
4. 处理器支持能够容纳一定量数据(可能是几千字节) 的硬件堆栈。
5. 处理器有将堆栈指针和其它CPU 寄存器读出和存储到堆栈或内存中的指令。
15、 μC/OS-II移植的内容?
移植的内容主要是完善OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三个文件。 移植具体工作包括以下几个内容:
● ● 声明10个数据类型(OS_CPU.H)
● ● 用C 语言编写十个简单的函数(OS_CPU_C.C)
● 16、 请Thumb-2的RBIT 、CLZ 、IT 等指令对μC/OS-II的任务调度算法进行优化。
17、 请编程实现通过LM3S8962的串口输出10个“A ”和10个“B ”,分别由两个任务完
成(MyTask 输出“A ”,所需堆栈为50个字节,优先级为1;YouTask 输出“B ”,所需堆栈为50个字节,优先级为2),已完成除主函数外的所有代码编写,请在μC/OS-II下完成主程序代码。
答:
#include // 预处理文件
#define TASK_My_STK_SIZE 50 // 两个任务堆栈大小
#define TASK_You_STK_SIZE 50
static OS_STK MyTask_Stk[TASK_My_STK_SIZE-1]; // 堆栈空间
static OS_STK YouTask_Stk[TASK_My_STK_SIZE-1];
static void MyTask(void *parg); // 原型声明
static void YouTask(void *parg);
int main (void)
{
OSInit(); // OS-II 初始化uC/OS-II的内核 OSTaskCreate (MyTask,0,
&MyTask_Stk[TASK_My_STK_SIZE-1],
1); // 创建mytask 任务
OSTaskCreate (YouTask, 0,
&YouTask_Stk[TASK_You_STK_SIZE-1],
2); // 创建youtask 任务
OSStart(); // uC/OS-II 启动uC/OS-II return(0) ;
}
18、 如图所示,为高效DC-DC 数控恒流源结构框图,输入电压Ui=15V,输出电流Io :
200~2000mA连续可调,请简述其工作原理。
答:工作原理:系统用LM3S615为主控制器,通过内部PWM 模块输出20KHz 脉冲波,通过调节占空比来驱动DC-DC 中的开关管,以达到恒定的电流输出;输出部分通过取样电路采集输出电流、电压参数,由微控制器处理,再微调输出参数,达到反馈控制,以输出不同电流;系统实时监控,具有过压保护功能,排除过压故障后,电源能自动恢复为正常状态。
19、 如图所示,单片机PB0去控制LED 显示,PB1去控制蜂鸣器。由两个任务:Taskled 、
Taskbuz 完成控制。Taskled 任务完成LED 灯的闪烁间隔1S 亮一次。Taskbuz 任务完成蜂鸣器发声,间隔1S 叫一次。现已完成两个任务代码的编写和目标板初始化代码(targetInit())的编写如代码所示,要求用uc/os-II操作系统管里完成主程序。
答:#include
/***************** TASK PRIORITIES 任务优先级**************************/ #define TASK_Led_PRIO 1
#define TASK_Buz_PRIO 5 /***************** TASK STACK SIZES 任务堆栈大小**********************/ #define TASK_Led_STK_SIZE 50
#define TASK_Buz_STK_SIZE 50
/******************* CONSTANTS 常量************************************/ #define LED_SYSCTL SYSCTL_PERIPH_GPIOB /* System control of LED1 */ #define LED_GPIO_PORT GPIO_PORTB_BASE /* IO port of LED1 */ #define LED_PIN GPIO_PIN_0 /* Pin number of LED1 */ #define BUZ_SYSCTL SYSCTL_PERIPH_GPIOB /* System control of the buzzer */ #define BUZ_GPIO_PORT GPIO_PORTB_BASE /* IO port of the buzzer */ #define BUZ_PIN GPIO_PIN_1 /* Pin number of the buzzer */ /********************** VARIABLES 变量*********************************/ static OS_STK TaskLed_Stk[TASK_Led_STK_SIZE]; /* The stack of start task */ static OS_STK TaskBuz_Stk[TASK_Buz_STK_SIZE]; /* 启动任务的堆栈 */ /**************************函数声明**************************************/ static void TaskLed(void *parg);
static void TaskBuz(void *parg);
void ledToggle (void) ;
void buzToggle (void) ;
/***************** TaskLed ,驱动LED 闪烁, 间隔1S 亮一次。****************/ static void TaskLed (void *parg)
{
parg=parg;
targetInit(); /* 初始化目标单片机 while(1)
{
*/
ledToggle();
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
/************ TaskBuz ,驱动蜂鸣器,间隔1S 叫一次。*************************/ static void TaskBuz (void *parg)
{
parg=parg;
while(1)
{
buzToggle ();
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
/********************************取反LED 操作****************************/ void ledToggle (void)
{
GPIOPinWrite(LED_GPIO_PORT, LED_PIN, ~GPIOPinRead(LED_GPIO_PORT, LED_PIN));
}
/********************************取反蜂鸣器操作**************************/ void buzToggle (void)
{
GPIOPinWrite(BUZ_GPIO_PORT, BUZ_PIN, ~GPIOPinRead(BUZ_GPIO_PORT, BUZ_PIN));
}
/*********************************主程序 *************************************/ int main (void)
{
intDisAll(); /* 关闭所有中断 */ OSInit(); /* OS-II 初始化uC/OS-II的内核 */ OSTaskCreate (TaskLed, 0,
&TaskLed_Stk[TASK_Led_STK_SIZE-1],
TASK_Led_PRIO) ; /* 创建TaskLed 任务 */ OSTaskCreate (TaskBuz, 0,
&TaskBuz_Stk[TASK_Led_STK_SIZE-1],
TASK_Buz_PRIO); /* 创建TaskBuz 任务 */
OSStart(); /* Start uC/OS-II 启动uC/OS-II */ return(0) ;
}
/*****************************************END********************************/