{ int i; rGPFDAT=0; for(i=0;i<100000;i++); rGPFDAT=0xF0; for(i=0;i<100000;i++); }
3、实现CAN总线通信需要哪两个芯片?画出S3C44B0利用CAN总线进行通信的硬件连接示意图。要实现两个开发平台间通过CAN总线双机通信,应如何设计程序(给出软件设计思路或程序流程图)。
答:1)MCP2510和TJA1050。(2分)
2)(3分)
S3C44B0
MCP2510TJA1050CANHCANL3)能正确表示CAN总线的初始化和发送接收编程思路(3分)
开发平台A编程思路:
1)初始化MCP2510 2)启动can总线收发
3)通过can口发送一个字符
开发平台B编程思路:
1)初始化MCP2510 2)启动can总线收发
3)通过can口接收一个字符
4、给出S3C44B0通过驱动器控制步进电机的硬件连接示意图;已知步进电机正转时的控制
顺序为A→AB→B→BC→C→CD→D→DA,以列表的形式给出各I/O控制口的值。可以通过哪个宏来设置I/O控制口的值。 答:1)
2)高四位I/O控制口的值
3)可以通过宏SETEXIOBITMASK(bit,mask)(EXIO.h)来设置扩展I/O 口。
5、TCP/IP协议可以分为哪几层?画出S3C44B0进行网络通信的硬件框图;要实现基于UDP
的网络通信,应如何设计程序,给出编程思路或程序流程图。
1)分为: 物理层
数据链路层(IEEE802.3 Ethernet MAC) 网络层(IP、ARP、ICMP、IGMP) 传输层 (TCP、UDP) 应用层(BSD Sockets)
2)
3)能正确描述实现网络初始化、创建、绑定、发送和接收UPD包的过程。
编程思路:1)初始化以太网 2)创建socket套接字 3)绑定socket套接字和本机Ip 4)通过socket发送数据 或5)通过socket接收数据 最后两步顺序可换
6、独立式键盘和矩阵式键盘各有什么优缺点?画出矩阵式键盘连接示意图;若采用矩阵式键盘,怎样编程获得按下的键值,给出编程思路或流程图。
1)独立式键盘占有I/O口较多,但编程简单;矩阵式键盘占有I/O接口较少,编程相对复杂。
2)
+5V行(输出端口)B1123B24B3567列(输入端口)89B1B2B3 3)识别矩阵键盘按键的方法分为两步:第一步,识别键盘有无键被按下;第二步,如果有键被按下,识别出具体的按键。
识别键盘有无键被按下的方法是:让所有行线均置为0电平,检查各列线电平是否有变化,如果有变化,则说明有键被按下,如果没有变化,则说明无键被按下。
识别具体按键的方法是(亦称扫描法):逐行置零电平,其余各行置为高电平,检查各列线电平的变化,如果某列电平有高电平变为零电平,则可确定此行此列交叉点处的按键被按下
7、阅读以下S3C2410部分用户手册.求:当PCLK 或 UCLK 为40 MHz时,串口0的波特
率为2400 bps ,串口1的波特率为115200bps,相应的控制寄存器如何设置.(8分)
UART BAUD RATE DIVISOR REGISTER
There are three UART baud rate divisor registers(寄存器)including UBRDIV0, UBRDIV1 and UBRDIV2 in the UART block(模块). The value stored in the baud rate divisor register (UBRDIVn), is used to determine the serial Tx/Rx clock rate(baud rate) as follows: UBRDIVn = (int)(PCLK / (bps x 16) ) –1 or
UBRDIVn = (int)(UCLK / (bps x 16) ) –1
Where, the divisor should be from 1 to (216-1) and UCLK should be smaller than PCLK. Register UBRDIV0 UBRDIV1 UBRDIV2 Address 0x50000028 0x50004028 0x50008028 Bit [15:0] R/W R/W R/W R/W Description Baud rate divisor register 0 Baud rate divisor register 1 Baud rate divisor register 2 Reset Value – – – UBRDIVn Description Baud rate division value UBRDIVn >0 Initial State – UBRDIV
答: 根据UBRDIVn = (int)(PCLK / (bps x 16) ) –1
寄存器UBRDIV0= (int)(40000000/2400*16)-1=1040=10000010000(B)
寄存器UBRDIV1=( int)(40000000/115200*16)-1=20=10100(B)
8、 试写出μC/OS-II多任务程序框架结构C程序示意代码,要求至少包含两个任务,并为每个任务设计和分配堆栈,同时要求每个任务都有机会获得处理器运行。另外回答以下问题
(1) 在操作系统多任务调度策略中,什么是基于优先级的抢占式调度策略?在μC/OS-II中是如何防止最高优先级任务独占CPU的?
(2) μC/OS-II中每个任务都是死循环,如果最高优先级任务的这个死循环中出现了这样一句代码:“ for(;;); ”,试问会出现什么现象?为什么?如何防止? 参考答案: 代码框架
int Stack1[1024]; //定义将用于任务堆栈的数组 int Stack2[1024]; //定义将用于任务堆栈的数组 void Task1 (void *pdata) {
for (;;) { … …
OSTimeDlyHMSM(0, 0, 4, 0); //等待 } }
void Task2 (void *pdata) {
for (;;) { … …
OSTimeDlyHMSM(0, 0, 4, 0); //等待 } }
void main (void) {
char* s1=\ //定义要显示的字符 char* s2=\ //定义要显示的字符 OSInit(); //初始化uCOS_II OSTaskCreate(Task1, //创建任务MyTask s1, //给任务传递参数 & Stack1 [TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针 0); //使任务MyTask的优先级别为0 OSTaskCreate(Task2, //创建任务MyTask s2, //给任务传递参数 & Stack2 [TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针 1); //使任务MyTask的优先级别为0 OSStart(); //启动uCOS_II的多任务管理 }
最高优先级任务中出现了for ( ; ; ) ; ,将出现死机,因为其他任务都无法剥夺该任务的CPU,而该任务陷入不会主动放弃CPU的死循环,解决办法就是规定除了空闲任务,每个任务在进入下一轮循环之前,必须主动调用延时函数或多或少的放弃CPU一定时间。