项目场景:
系统通过zigbee个人网收集信息,并汇总到协调器,协调器再转发到嵌入式终端。
问题描述
(1)嵌入式设计里面,其核心为嵌入式处理器,请回答嵌入式处理器的基本分类?上面的方案中,可能涉及到哪几类?
(2)在嵌入式终端设计实现部分,处理器可以选择了STM32系列或s5p6818,结合专业知识,分析这两个方案的优缺点。
(3)如果选择s5p6818处理器,以本课程的实验平台为例,简述一下开发环境的搭建?
(4)如果你在开发过程中,发现系统不能正常登录,再确认系统损坏的情况下,你应该
重构系统,请回答重构系统的大致步骤?
(5)在重构系统时,bootloader是必须涉及的,说一下bootloder的作用,并指出uboot与bootloader关系?在uboot中,汇涉及混合编程,请说明混合编程相关知识?
(6)如果界面开发选用QT方案,信号和槽是必须涉及的知识,请用文字描述你对信号和槽的理解
(7)重装系统后,发现平台缺少某个开关设备的驱动,请结合你的理解,修改实验四的代码。(开关设备为输出设备,用来接收处理器PA10发出的开关信号)
(8)如果驱动正确,请写出驱动生成设备文件的过程(文件为/dev/ss),并写出测试程序。
(9)在qt设计中,需要用一个按钮控制上面的设备,用文字和流程图描述你设Qt程序的思路。
解决方案:
(1)嵌入式处理器的分类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP处理器,嵌入式片上可编程系统SOC。以上设计包含:嵌入式微处理器、嵌入式微控制器。
(2)STM32:它是一个芯片系列。主要有价格较低、低功耗、高性能、丰富的外设接口的优点,有开发难度较大的缺点。
s5p6818:它是芯片型号。主要有使用效果好、拓展性好、功能强悍的优点,但适用于需要处理大量数据或运行复杂算法的应用。
(3)
编译环境搭建:
1、创建Ubuntu系统:安装Vm虚拟机——新建虚拟机——安装Ubantu。
2、安装开发工具:安装Vim、g++、TFTP服务、NFS服务、交叉编译工具链。
3、搭建交叉编译工具链、配置uboot和内核源码。
QT环境搭建:
1、在windows下安装QT开发环境
2、将工程文件压缩到Ubuntu
3、进行编译,生成开发板能运行的程序,QT库下载到开发板上。
4、工程进行QT附包,把嵌入式平台对应的库安装到系统中。
(4)
1、编译Uboot:安装Uboot,内核源码包——编译Uboot。
2、编译内核。
3、创建根文件系统:利用现有系统源码制作镜像——制作根文件系统。
(5)Bootloader是启动引导程序,主要作用是加载操作系统内核并启动系统。Bootloader不是一个程序,而是一类程序的总称,Uboot是其中的一种。混合编程指一个程序中同时使用多种编程语言的技术,主要有源程序相互调用和内联汇编。
(6)信号和槽是Qt中的一种机制,用于实现对象之间的通信。信号是一种特殊的函数,当某个事件发生时会自动发出信号;槽是一种普通的函数,用于接收信号并进行相应的处理。通过将信号与槽连接起来,可以实现对象之间的交互和通信。
(7)开关设备一般是通过GPIO口控制的,因此,我们需要使用相应的GPIO控制器来操作此类设备。驱动程序的功能是向该GPIO控制器发送确定信号以打开或关闭开关设备。在Linux系统中,驱动程序通常被编写为内核模块。因此,首先我们需要编写一个GPIO控制器驱动程序的内核模块,以此支持开关设备的操作。
(8)当GPIO控制器驱动程序正确安装到内核中后,系统会自动创建/dev目录下的设备文件。我们可以使用函数调用mknod或udev命令手动创建设备文件。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#define DEVICE_PATH "/dev/ss"
void main(void)
{
int fd, ret;
char buf[2] = {'0', '\0'};
fd = open(DEVICE_PATH, O_RDWR);
if(fd < 0){
perror("open:");
exit(EXIT_FAILURE);
}
ret = write(fd, buf, 1);
if(ret < 0){
perror("write:");
exit(EXIT_FAILURE);
}
printf("Device closed.\n");
close(fd);
exit(EXIT_SUCCESS);
}
(9)首先,我们需要在Qt Creator中创建一个新项目,选择Qt Widgets Application。创建完毕后,我们可以在主窗口中添加一个PushButton控件和一个QLabel控件。在QPushButton的clicked信号中,我们将会调用一个函数来打开或关闭设备。为了提高程序的健壮性,我们还需要检查设备的状态,以便在设备已经打开或关闭的情况下不再重复执行打开或关闭操作。
代码如下:
#include <fcntl.h>
void set_device_state(int state)
{
int fd, ret;
char buf[2] = {'0', '\0'};
fd = open("/dev/ss", O_RDWR);
if(fd < 0){
perror("open:");
return;
}
ret = read(fd, buf, 1);
if(ret < 0){
perror("read:");
close(fd);
return;
}
if(state == 1 && buf[0] == '0'){
buf[0] = '1';
write(fd, buf, 1);
ui->label_status->setText("Device opened.");
} else if(state == 0 && buf[0] == '1'){
buf[0] = '0';
write(fd, buf, 1);
ui->label_status->setText("Device closed.");
}
close(fd);
}
流程图如下: