文档库 最新最全的文档下载
当前位置:文档库 › 湖北汽院嵌入式系统开发实验

湖北汽院嵌入式系统开发实验

湖北汽院嵌入式系统开发实验
湖北汽院嵌入式系统开发实验

实验二嵌入式 Linux 多线程通信实验

程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。

P(S):

①将信号量S 的值减1,即S=S-1;

②如果S≥0,则该进程继续执行;否则该进程状态置为阻塞状态,进程PCB 排入信号量

PCB 队列末尾,放弃CPU,等待V 操作的执行。

V(S):

1 将信号量S 的值加1,即S=S+1;

2 如果S≤0,释放信号量队列中第一个PCB 所对应的进程,将进程状态由阻塞态改为就

绪态。执行V 操作的进程继续执行。

#include

#include

#include

#include

#define MAXSIZE 10

int stack[MAXSIZE];

int size=50;

int front=-1,rear=0;

sem_t avail,full; //avail 表示可用的空缓冲区,full 表示已存放产品的缓冲区

//生产者

pthread_t provider,customer,end;

void provider_fun(void) //full 表示已存放产品的缓冲区

{

int i=1;

sleep(5);

while(i<=size) //生产50 个产品,需要放入到MAXSIZE 个缓冲区中

{

sem_wait(&avail); //avail 信号量P 操作,表示将可用的空缓冲区个数减1

stack[rear]=i;

printf("produce the %d product\n",stack[rear]);

rear=(rear+1)%MAXSIZE;

i++;

sleep(1);

sem_post(&full); //full 信号量V 操作,表示将存放产品的缓冲区个数加1

}

pthread_exit(NULL);

}

//消费者

void customer_fun(void)

{

int i=1;

while(i<=size)

{

sem_wait(&full); //fulll 信号量P 操作,表示将存放产品的缓冲区个数减1

front=(front+1)%MAXSIZE;

printf("\t consume the%d product\n",stack[front]);

stack[front]=0;

sleep(2);

sem_post(&avail); //avail 信号量V 操作,表示将可用的空缓冲区个数加1

i++;

}

pthread_exit(NULL);

}

void end_fun(void)

{

char ch;

scanf("%c",&ch);

pthread_cancel(provider);

pthread_cancel(customer);d

pthread_exit(NULL);

printf("exit!\n");

}

void main()

{

pthread_t provider,customer; //定义生产者线程对象和消费者线程对象

sem_init(&avail,0,MAXSIZE); //将avail 信号量初始化为MAXSIZE

sem_init(&full,0,0); //将full 信号量初始化为0

pthread_create(&provider, NULL, (void *)provider_fun, NULL); // 创建生产者线程pthread_create(&customer, NULL, (void *)customer_fun, NULL);// 消费者线程pthread_create(&end, NULL, (void *)end_fun, NULL);

pthread_join(provider,NULL);

pthread_join(customer,NULL);

pthread_join(end,NULL);

sem_destroy(&avail);

sem_destroy(&full);

}

实验三、嵌入式 Linux 网络通信实验

3、TCP套接字通信步骤

服务器端:

(1)调用socket()创建套接字,然后初始化struct sockaddr_in结构体。

(2)调用bind函数()为套接字绑定一个IP地址和一个端口号。

(3)调用listen()函数使套接字成为监听套接字,侦听指定的端口。

(4)调用accept()函数,使服务器处于阻塞状态,等待接受客户端连接请求。一旦建立连接,将产生新的套接字,此时就有两个套接字了,原来的那个套接字还在监听等待指定的端口,而新产生的套接字则准备发送或接受数据。

(5)利用send/sendto和recv/recvfrom进行数据传输。当然也可以调用write或read.

(6)数据传输完毕,关闭套接字。

请补充server.c中代码

//fuwuqi

#include

#include // 包含套接字函数库

#include

#include // 包含AF_INET相关结构

#include // 包含AF_INET相关操作的函数

#include

#include //bzero()

#define MAXDATASIZE 50

int main()

{

int server_sockfd; //服务器端socket描述符变量,用以监听客户端的TCP连接

int new_sockfd ; //当监听到并接受一个TCP连接时,accept()返回一个新的socket,用这个socket接受数据

struct sockaddr_in server_addr; //服务器端sockaddr_in的数据结构

struct sockaddr_in client_addr; //用于accept()存放客户端的socket数据结构

int client_addr_len; //用于返回struct sockaddr_in的长度,作为accept()中的一个参数

char buf[MAXDATASIZE]; //创建一个buf来存放接受的数据

int numbytes; //用以返回接受到的字节数

server_sockfd = socket(AF_INET , SOCK_STREAM , 0); //创建一个TCP套接字,其中协议族为AF_INET,套接字类型为SOCK_STREAM,第三个参数为0

server_addr.sin_family = AF_INET; //server_addr.sin_family为AF_INET

server_addr.sin_addr.s_addr = inet_addr("10.10.58.130"); //server_addr.sin_addr.s_addr为服务器端IP地址,需经inet_addr()转化为网络IP字节序

server_addr.sin_port =htons(1025); //server_addr.sin_port为一个大于1024的端口号,需经htons()转化为网络字节序

bind(server_sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)); //将server_sockfd绑定到server_addr指定的IP和端口上

listen(server_sockfd,5); //为server_sockfd创建包含5个TCP连接的监听队列,将其设置为监听套接字

while (1) {

client_addr_len = sizeof(struct sockaddr_in); //计算sockaddr_in的长度

new_sockfd= accept(server_sockfd,(struct sockaddr *)&client_addr,&numbytes);//等待接受客户端发来的TCP连接,若连接成功,返回新的socket

numbytes = recv(new_sockfd,buf,20, 0); //将客户端发来的数据存放在buf中,返回接

受到的字节数

if (numbytes)

{

printf(" %s \n",buf); //输出buf中数据

}

sleep(3);

send(new_sockfd,"I am server",20, 0); //向客户端发送"I am server"

close(new_sockfd);

if('8'==getchar())

{

break;

}

}

close(server_sockfd);

return 0;

}

客户端:

(1)调用socket()创建套接字,然后初始化struct sockaddr_in结构体,注意服务器端和客户端的struct sockaddr_in结构体应该一致。

(2)调用connection()函数与服务器建立连接。

(3)利用send/sendto和recv/recvfrom进行数据传输. 当然也可以调用write或read.

(4)数据传输完毕,关闭套接字。

请补充client.c中代码

//KEHU

#include

#include // 包含套接字函数库

#include

#include // 包含AF_INET相关结构

#include // 包含AF_INET相关操作的函数

#include

#include //bzero()

#define MAXDATASIZE 50

int main(int argc, char *argv[])

{

int sockfd,result; //客户端socket描述符变量

struct sockaddr_in server_addr;//与服务器端sockaddr_in的数据结构一致

char buf[MAXDATASIZE]; //用以接受服务器端发送过来的数据

int numbytes; //用以返回从服务端发送过来的数据字节数

sockfd = socket(AF_INET,SOCK_STREAM, 0); //创建一个TCP套接字,其中协议族为AF_INET,套接字类型为SOCK_STREAM,第三个参数为0

server_addr.sin_family =AF_INET;//address_addr_addr.sin_family为AF_INET

server_addr.sin_addr.s_addr = inet_addr("10.10.58.130"); //address_addr_addr.sin_addr.s_addr为服务器端IP地址,需经inet_addr()转化为网络IP字节序

server_addr.sin_port =htons(1025);//address_addr_addr.sin_port为一个大于1024的端口号,需经htons()转化为网络字节序

result = connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));//与address_addr_addr指定的服务器建立连接

send(sockfd,"this is client",20, 0); //向服务器端发送"this is client"

sleep(3);

numbytes = recv(sockfd,buf,50, 0); //接受服务器端发送过来的数据,保存在buf中

if (numbytes)

{

printf(" %s \n",buf); //输出buf里面的数据

}

close(sockfd);

return 0;

}

实验四、嵌入式 Linux 串行端口编程实验

6. 什么是全双工和半双工

全双工(Full duplex)是说计算机可以同时接受和发送数据——也就是它有两个分开的数据传输通道(一个传入,一个传出)。

半双工(Half duplex)表示计算机不能同时接受和发送数据,而在某一时刻它只能单一的传送或者接收。这通常意味着,它只有一个数据通道。半双工并不是说RS-232的某些信号不能使用,而是,它通常是使用了有别于RS-232的其他不支持全双工的标准。

#include/*标准输入输出定义*/

#include/*标准函数库定义*/

#include/*Unix 标准函数定义*/

#include

#include

#include/*文件控制定义*/

#include/*PPSIX 终端控制定义*/

#include/*错误号定义*/

#define FALSE -1

#define TRUE 0

int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,

B38400, B19200, B9600, B4800, B2400, B1200, B300, };

int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };

char buffer[1024];

int Length;

//int nByte = write(fd, buffer ,Length);

//读取串口数据代码:d

char buff[1024];

int Len;

void set_speed(int fd, int speed){

int i;

int status;

struct termios Opt;

tcgetattr(fd, &Opt);

for ( i= 0; i

if (speed == name_arr[i]) {

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt, speed_arr[i]);

cfsetospeed(&Opt, speed_arr[i]);

status = tcsetattr(fd, TCSANOW, &Opt);

if (status != 0) {

perror("tcsetattr fd1");

return;

}

tcflush(fd,TCIOFLUSH);

}

}

}

int set_Parity(int fd,int databits,int stopbits,int parity)

{

struct termios options;

if ( tcgetattr( fd,&options) != 0) {

perror("SetupSerial 1");

return(FALSE);

}

options.c_cflag&= ~CSIZE;

switch (databits) /*设置数据位数*/

{

case 7:

options.c_cflag |= CS7;

break;

case 8:

options.c_cflag |= CS8;

break;

default:

fprintf(stderr,"Unsupported data size\n"); return (FALSE);

}

switch (parity)

{

case'n':

case'N':

options.c_cflag&= ~PARENB; /* Clear parity enable */

options.c_iflag&= ~INPCK; /* Enable parity checking */

break;

case'o':

case'O':

options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */ break;

case'e':

case'E':

options.c_cflag |= PARENB; /* Enable parity */

options.c_cflag&= ~PARODD; /* 转换为偶效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */

break;

case'S':

case's': /*as no parity*/

options.c_cflag&= ~PARENB;

options.c_cflag&= ~CSTOPB;break;

default:

fprintf(stderr,"Unsupported parity\n");

return (FALSE);

}

/* 设置停止位*/

switch (stopbits)

{

case 1:

options.c_cflag&= ~CSTOPB;

break;

case 2:

options.c_cflag |= CSTOPB;

break;

default:

fprintf(stderr,"Unsupported stop bits\n");

return (FALSE);

}

/* Set input parity option */

if (parity != 'n')

options.c_iflag |= INPCK;

tcflush(fd,TCIFLUSH);

options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/

options.c_cc[VMIN] = 0; /* Update the options and do it NOW */

if (tcsetattr(fd,TCSANOW,&options) != 0)

{

perror("SetupSerial 3");

return (FALSE);

}

return (TRUE);

}

int OpenDev(char *Dev)

{

int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd)

{

perror("Can't Open Serial Port");

return -1;

}

else

return fd;

}

int main(int argc, char **argv){

int fd;

int nread;

char buff[1024];

char *dev = "/dev/ttyUSB0"; //串口二

fd = OpenDev(dev);

set_speed(fd,115200);

if (set_Parity(fd,8,1,'N') == FALSE) {

printf("Set Parity Error\n");

exit (0);

}

while (1) //循环读取数据

{

memset(buff,0,1024);

while((nread = read(fd, buff, 1024))>0)

{

//printf("\nLen %d\n",nread);

buff[nread+1] = '\0';

printf("%s", buff);

memset(buff,0,1024);

}

}

close(fd);

exit (0);

}

实验五、嵌入式 Linux 内核编程实验

你可以使用头文件linux/fs.h中的函数register_chrdev来实现注册一个某个驱动模块对应的主设备号。

register_chrdev一般在int device_init()函数中调用,即将内核驱动模块加载入内核意味着要向内核注册自己。

如果你向函数register_chrdev传递为0的主设备号,那么返回的就是动态分配的主设备号。此时应该通过命令“cat /proc/devices”命令输出得到,使用mknod统调用建立设备文件。

4.Linux 的驱动程序编译方法

(1)将其源代码添加到内核源文件中,然后静态编译整个内核,再运行新的内核来测试(2)编译为模块的形式,单独加载运行调试

5.驱动程序与应用程序的区别

(1)应用程序一般有一个main 函数,从头到尾执行一个任务;驱动程序却不同,它没有main 函数,通过使用宏module_init(初始化函数名); 将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏moudule_exit(退出处理函数名)注册退出处理函数。它在驱动退出时被调用。

(2)应用程序可以和GLIBC 库连接,因此可以包含标准的头文件,比如, 在驱动程序中是不能使用标准C 库的,因此不能调用所有的C 库函数,比如输出打印函数只能使用内核的printk函数,包含的头文件只能是内核的头文件,比如:

7.字符驱动程序编写流程

(1) 包含字符设备驱动程序所必需包含的头文件

(2)

(3) 编写file_operations结构体中功能接口函数,

(4) 定义file_operations结构变量,建立用户程序调用函数与驱动功能接口的对应关系。

(5) 编写字符设备驱动程序加载函数,完成设备文件注册及必要的初始化

(6) 编写字符设备驱动程序卸载函数,完成注销及必要的环境恢复。

(7) 编写Makefile文件,使用make来编译Makefile,生成****.ko内核模块文件

(8) 使用“insmod ***.ko”加载设备驱动程序,并调用dmesg来查看输出结果

(9) 使用“cat /proc/devices”查看获取主设备号

(10) 使用“mknod /dev/设备文件名主设备号0”来创建设备文件

(11) 编写用户应用程序,调用用户调用接口对驱动功能接口进行测试。

(12) 使用“rmmod /dev/设备文件名”卸载驱动模块,并调用dmesg查看

#include //模块所需的大量符号和函数定义

#include //文件系统相关的函数和头文件

#include //cdev结构的头文件

#include //copy_to_user()/copy_from_user()定义

#define DEVICE_NAME "Dev_frame" //定义模块名,用”cat /proc/devices”命令查看int DEVICE_MAJOR = 0; //如果为0,则由系统自动分配主设备号

#define M_LENGTH 10

char core_data0[M_LENGTH][M_LENGTH]; //定义内核数据矩阵

char core_data1[M_LENGTH][M_LENGTH]; //

/*-----------------------------------------------*/

int device_open(struct inode *inode, struct file *filp) {

char c='a';

int i,j;

printk("user open device.\n");

for(i=0;i

for(j=0;j

core_data0[i][j]=c+j; //初始化内核数据矩阵

}

}

return 0; }

/*-----------------------------------------------*/

ssize_t device_write(struct file *filp,const char *buffer, size_t count, loff_t *f_pos)

{int i,j;

printk("user write data to driver.\n");

//将用户空间传递过来buffer里面的数据复制到内核空间core_data1数组中

copy_from_user(buffer,core_data1,count);

for(i=0;i

for(j=0;j

printk("%c",core_data1[i]);//使用printk打印内核空间core_data1数组中元素

}

printk("\n");

}

return count;

}

/*-----------------------------------------------*/

ssize_t device_read(struct file *filp, char *buffer, size_t count, loff_t *f_pos)

{

printk("user read data from driver.\n");

copy_to_user(buffer,core_data0,count);//将内核空间core_data0数组复制到用户空间buffer

return count;

}

/*-----------------------------------------------*/

int device_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

{

printk("user ioctl runing.\n");

switch(cmd){

case 1:

printk("cmd = %d.\n",cmd);

break;

case 2:

printk("cmd = %d.\n",cmd);

break;

case 3:

printk("cmd = %d.\n",cmd);

break;

case 4:

printk("cmd = %d.\n",cmd);

break;

case 5:

printk("cmd = %d.\n",cmd);

break;

}

return cmd;

}

/*-----------------------------------------------*/

int device_release(struct inode *inode, struct file *filp)

{

printk("device release\n");

return 0;

}

/*---- device_fops 结构定义文件操作函数体之后----- ----*/

struct file_operations device_fops = {

.owner= THIS_MODULE,

.read=device_read,//将用户接口函数read与驱动功能函数device_read对应起来

.unlocked_ioctl=device_ioctl, //将用户接口函数ioctl与驱动功能函数device_ioctl对应起来

.open=device_open, //将用户接口函数open与驱动功能函数device_open对应起来

.write=device_write,//将用户接口函数write与驱动功能函数device_write对应起来

.release=device_release,//将用户接口函数release与驱动功能函数device_release对应起来};

/*-----------------------------------------------*/

int device_init(void) {

int ret;

/*字符驱动程序注册:

第1个参数为0(表示由系统自动分配主设备号),

第2个参数为设备文件名,

第3个参数为struct file_operations结构体变量指针*/

ret=register_chrdev(0,"Demo_device",&device_fops);

if(ret<0){

printk("register chrdev failure!\n");//字符驱动程序注册失败

return ret;

}

else{

printk("register chrdev ok!\n");

DEVICE_MAJOR=ret; //将系统分配的主设备号保存

}

return 0;

}

void device_exit(void) {

//字符驱动程序注销,第1个参数为主设备号,第2个参数为设备文件名,

unregister_chrdev(0,"Demo_device");

printk("unregister chrdev ok!\n");

}

module_init(device_init); //指定insmod--加载时执行device_init

module_exit(device_exit); //rmmod--卸载时执行执行device_exit

实验六、嵌入式 Linux Qt GUI 使用实验

//firstDialog.cpp

//#include

#include "firstDialog.h"

firstDialog::firstDialog(QWidget *parent)

: QDialog(parent)

{

lineEdit_1 = new QLineEdit;

label_1 = new QLabel("+");

lineEdit_2 = new QLineEdit;

label_2= new QLabel("=");

lineEdit_3 = new QLineEdit;

sumButton = new QPushButton("sum");

jianfaButton = new QPushButton("jianfa");

/*按钮部件大小和字体设置*/

sumButton->resize(50, 20);

sumButton->setFont(QFont("Times", 18, QFont::Bold));

connect(sumButton, SIGNAL(clicked()), this, SLOT(clickfun()));

connect(this, SIGNAL(sumsignal(QString,QString)), this, SLOT(sumfun(QString,QString)));

connect(jianfunButton, SIGNAL(clicked()), this, SLOT(clickfun()));

connect(this, SIGNAL(sumsignal(QString,QString)), this, SLOT(jianfun(QString,QString)));

QHBoxLayout *topLayout=new QHBoxLayout;

topLayout->addWidget(lineEdit_1);

topLayout->addWidget(label_1);

topLayout->addWidget(lineEdit_2);

topLayout->addWidget(label_2);

topLayout->addWidget(lineEdit_3);

QHBoxLayout *bottomLayout=new QHBoxLayout;

bottomLayout->addWidget(sumButton);

bottomLayout->addWidget(jianfaButton);

QVBoxLayout *mainLayout=new QVBoxLayout;

mainLayout->addLayout(topLayout);

mainLayout->addLayout(bottomLayout);

setLayout(mainLayout);

setWindowTitle("My first Qt App");

}

void firstDialog::clickfun()

{

QString a=lineEdit_1->text();

QString b=lineEdit_2->text();

emit sumsignal(a,b);

}

void firstDialog::sumfun(QString str1,QString str2)

{

int sum=0;

int num_1 = str1.toInt();

int num_2=str2.toInt();

sum=num_1+num_2;

lineEdit_3->clear();

lineEdit_3->setText(QString::number(sum,10));

}

void firstDialog::jianfun(QString str1,QString str2)

{

int sum=0;

int num_1 = str1.toInt();

int num_2=str2.toInt();

sum=num_1-num_2;

lineEdit_3->clear();

lineEdit_3->setText(QString::number(sum,10));

}

//firstDialog.h

#include

#include

class firstDialog:public QDialog

{

Q_OBJECT

public:

firstDialog(QWidget *parent=0); //firstDialog的构造函数

signals:

void sumsignal(QString text1,QString text2); //自己定义一个信号,信号的返回值都是void

public slots:

void clickfun(); //这个槽与按钮的click()信号对应

void sumfun(QString str1,QString str2); //这个槽与sumsignal()信号对应

void jianfun(QString str1,QString str2);

private:

QLabel *label_1;

QLabel *label_2;

QLineEdit *lineEdit_1;

QLineEdit *lineEdit_2;

QLineEdit *lineEdit_3;

QPushButton *sumButton;

QPushButton *jianfaButton;

};

//main.cpp

#include

#include "firstDialog.h"

int main( int argc, char *argv[] )

{

QApplication app(argc, argv);

firstDialog *dialog=new firstDialog;

dialog->show();

return app.exec();

}

嵌入式系统及应用 实验大纲

《嵌入式系统及应用》课程实验 一、实验课程的性质、目的和任务 性质:《嵌入式系统及应用》课程是自动化专业的专业基础课程,本实验课是该课程教学大纲中规定必修的实验教学内容。 目的和任务:通过实验环节来巩固和加深学生对嵌入式系统的理解,使学生掌握MCS51单片机和ARM的基本原理和应用技术。通过熟悉MCS51开发环境和ARM集成开发环境,使学生掌握嵌入式系统开发的一般规律和方法。在集成开发环境下,进行系统功能程序的编写和调试的训练,掌握嵌入式系统软硬件调试的一般方法和系统设计的能力。 二、实验内容、学时分配及基本要求

三、考核及实验报告 (一)考核 本课程实验为非独立设课,实验成绩占课程总成绩的15%,综合评定实验成绩。(二)实验报告 实验报告应包括: 实验名称 实验目的 实验内容与要求 设计思路(如:分析、程序流程图等) 实验步骤 实验代码(含必要注释) 实验结果分析 实验小结(本题调试过程中遇到的问题和解决方法、注意事项、心得体会等)注:综合型实验需写出系统功能、设计过程 实验报告的要求: 实验报告以文本形式递交,实验报告要书写规范、文字简练、语句通顺、图表清晰。 四、主要仪器设备 硬件:微型计算机;嵌入式系统开发平台。 软件:Keil C51;ADT 五、教材及参考书 教材

[1] 高锋.单片微型计算机原理与接口技术(第二版).北京:科学出版社,2007 [2] 自编.嵌入式系统及应用 参考书 [1] 王田苗.嵌入式系统设计与实例开发.北京:清华大学出版社,2003 [2] 陈赜.ARM9 嵌入式技术及Linux高级实践教程.北京:北京航空航天大学出版社,2005 [3] 李忠民等.ARM嵌入式VxWorks实践教程.北京:北京航空航天大学出版社,2006

嵌入式系统实验报告

实验报告 课程名称:嵌入式系统 学院:信息工程 专业:电子信息工程 班级: 学生姓名: 学号: 指导教师: 开课时间:学年第一学期

实验名称:IO接口(跑马灯) 实验时间:11.16 实验成绩: 一、实验目的 1.掌握 STM32F4 基本IO口的使用。 2.使用STM32F4 IO口的推挽输出功能,利用GPIO_Set函数来设置完成对 IO 口的配置。 3.控制STM32F4的IO口输出,实现控制ALIENTEK 探索者STM32F4开发板上的两个LED实现一个类似跑马灯的效果。 二、实验原理 本次实验的关键在于如何控制STM32F4的IO口输出。IO主要由:MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR、AFRH和AFRL等8个寄存器的控制,并且本次实验主要用到IO口的推挽输出功能,利用GPIO_Set函数来设置,即可完成对IO口的配置。所以可以通过了开发板上的两个LED灯来实现一个类似跑马灯的效果。 三、实验资源 实验器材: 探索者STM32F4开发板 硬件资源: 1.DS0(连接在PF9) 2.DS1(连接在PF10) 四、实验内容及步骤 1.硬件设计 2.软件设计 (1)新建TEST工程,在该工程文件夹下面新建一个 HARDWARE文件夹,用来存储以后与硬件相关的代码。然后在 HARDWARE 文件夹下新建一个LED文件夹,用来存放与LED相关的代码。 (2)打开USER文件夹下的test.uvproj工程,新建一个文件,然后保存在 LED 文件夹下面,保存为 led.c,在led.c中输入相应的代码。

(3)采用 GPIO_Set 函数实现IO配置。LED_Init 调用 GPIO_Set 函数完成对 PF9 和 PF10 ALIENTEK 探索者 STM32F407 开发板教程 119 STM32F4 开发指南(寄存器版) 的模式配置,控制 LED0 和 LED1 输出 1(LED 灭),使两个 LED 的初始化。 (4)新建一个led.h文件,保存在 LED 文件夹下,在led.h中输入相应的代码。 3.下载验证 使用 flymcu 下载(也可以通过JLINK等仿真器下载),如图 1.2所示: 图1.2 运行结果如图1.3所示:

(完整word版)嵌入式系统设计与应用

嵌入式系统设计与应用 本文由kenneth67贡献 ppt文档可能在W AP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 课程名称:课程名称:嵌入式系统设计与应用 总学时:其中讲课36学时,上机实践环节12 36学时12学时总学时:其中讲课36学时,上机实践环节12学时教材:嵌入式系统设计教程》教材:《嵌入式系统设计教程》电子工业出版社马洪连参考书:参考书:1、《嵌入式系统开发与应用》北航出版社、田泽编著. 嵌入式系统开发与应用》北航出版社、田泽编著. 2、《ARM体系结构与编程》清华大学出版社杜春雷编著ARM体系结构与编程体系结构与编程》嵌入式系统设计与实例开发—ARM ARM与C/OS3、《嵌入式系统设计与实例开发ARM与μC/OS-Ⅱ》清华大学出版社王田苗、魏洪兴编著清华大学出版社王田苗、ARM嵌入式微处理器体系结构嵌入式微处理器体系结构》4、《ARM嵌入式微处理器体系结构》北航出版社、马忠梅等著. 北航出版社、马忠梅等著. 张石.ARM嵌入式系统教程嵌入式系统教程》5、张石.《ARM嵌入式系统教程》.机械工业出版2008年社.2008年9月 1 课程内容 绪论:绪论: 1)学习嵌入式系统的意义2)高校人才嵌入式培养情况嵌入式系统设计(实验课)3)嵌入式系统设计(实验课)内容安排 第1章嵌入式系统概况 1.1 嵌入式系统的定义1.2 嵌入式系统的应用领域及发展趋势1.3 嵌入式系统组成简介 第2章嵌入式系统的基本知识 2.1 2.2 2.3 嵌入式系统的硬件基础嵌入式系统的软件基础ARM微处理器的指令系统和程序设计ARM微处理器的指令系统和程序设计 2 第3章 3.1 3.2 3.3 基于ARM架构的嵌入式微处理器基于ARM架构的嵌入式微处理器ARM 概述嵌入式微处理器的组成常用的三种ARM ARM微处理器介绍常用的三种ARM 微处理器介绍 第4章 4.1 4.2 4.3 4.4 4.5 4.6 嵌入式系统设计 概述嵌入式系统的硬件设计嵌入式系统接口设计嵌入式系统人机交互设备接口嵌入式系统的总线接口和网络接口设计嵌入式系统中常用的无线通信技术 3 第5章嵌入式系统开发环境与相关开发技术 5.1 5.2 5.3 5.4 5.5 6.1 6.2 6.3 6.4 概述嵌入式系统的开发工具嵌入式系统调试技术嵌入式系统开发经验嵌入式系统的Bootloader Bootloader技术嵌入式系统的Bootloader技术μC/OS-II操作系统概述C/OS-II操作系统概述ADS开发环境ARM ADS开发环境C/OS-II操作系统在ARM系统中的移植操作系统在ARM μC/OS-II操作系统在ARM系统

南邮嵌入式系统B实验报告2016年度-2017年度-2

_* 南京邮电大学通信学院 实验报告 实验名称:基于ADS开发环境的程序设计 嵌入式Linux交叉开发环境的建立 嵌入式Linux环境下的程序设计 多线程程序设计 课程名称嵌入式系统B 班级学号 姓名 开课学期2016/2017学年第2学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 三、实验过程与结果 1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。 代码1:使用C内嵌汇编 #include int find_gcd(int x,int y) { int gcdnum; __asm { MOV r0, x MOV r1, y LOOP: CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE LOOP MOV r3, r0 MOV gcdnum,r3 //stop // B stop // END } return gcdnum; } int main() { int a; a = find_gcd(18,9);

printf("gcdnum:%d\n",a); return 0; } 代码2:使用纯汇编语言 AREA example1,CODE,readonly ENTRY MOV r0, #4 MOV r1, #9 start CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE start MOV r3, r0 stop B stop END 2、寄存器R0 、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。 代码1:使用纯汇编语言 AREA examp,CODE,READONL Y ENTRY MOV R0,#10 MOV R1,#30 MOV R2,#20 Start CMP R0,R1 BLE lbl_a CMP R0,R2 MOVGT R3,R0 MOVLE R3,R2 B lbl_b lbl_a CMP R1,R2 MOVGT R3,R1 MOVLE R3,R2 lbl_b B . END 代码2:使用C内嵌汇编语言 #include int find_maxnum(int a,int b,int c)

嵌入式系统综合实验一

实验名称: 姓名: 学号: 装 订 线 P.1 实验报告 课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________ 实验名称:综合实验一dht11和人体感应传感器 实验类型:验证型 同组学生姓名:孙凡原 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 1.掌握字符设备驱动程序的基本结构和开发方法 2.掌握用户空间调用设备驱动的方法 3.掌握用户和内核的交互 二、实验内容和原理 1.编写温湿度传感器DHT11驱动,传输打印温湿度信息 2.编写人体感应传感器驱动,控制LED 灯亮灭 原理: 温湿度传感器DHT11: 1.引脚图 实际使用传感器没有NC 引脚 2.数据采集 a.数据总时序 用户主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发 专业:测控技术与仪器 姓名:颜睿 学号:3130103850 日期:2018.4.28 地点:创客空间

装订线送响应信号,送出40bit 的数据,幵触发一次信采集。 b.主机发送起始信号 连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于18ms,然后等待DHT11 作出应答信号。 c.检测从机应答信号 DHT11 的DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11 的DATA引脚处于输出状态,输出80 微秒的低电平作为应答信号,紧接着输出80 微秒的高电平通知外设准备接收数据。 d.接收数据 (1)数据判定规则 位数据“0”的格式为:50 微秒的低电平和26-28 微秒的高电平,位数据“1”的格式为:50 微秒的低电平加70微秒的高电平。 接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。

嵌入式系统设计实验四

实验报告 课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________ 实验名称:实验四C 语言裸机编程 实验类型:验证型 同组学生姓名:__孙凡原_______ 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 ? 初步了解C 运行库 ? 初步了解gcc arm 常用编译选项 ? 了解ARM 中断处理过程 二、实验内容和原理 ? 编写C 裸机代码实现跑马灯,通过控制Timer 中断实现 ? 通过控制uart 串口进行调试打印 三、主要仪器设备 树莓派、PC 机 四、操作方法和实验步骤 1 通过定时器产生中断,控制gpio ,实现跑马灯 2 控制uart 控制器,产生调试打印。 五、实验数据记录和处理 1.主程序arm.c 注释 //包含头文件 #include #include #include #include "rpi-aux.h" #include "rpi-armtimer.h" #include "rpi-gpio.h" #include "rpi-interrupts.h" #include "rpi-systimer.h" #include "rpi-led.h" /** Main function - we'll never return from here */ void kernel_main( unsigned int r0, unsigned int r1, unsigned int atags ) 专业:测控技术与仪器 姓名:颜睿 学号:3130103850 日期:2018.3.28 地点:创客空间

嵌入式系统设计性实验报告

嵌入式系统设计性实验报告 水温控制系统 院别:控制工程学院 专业:自动 学号:5090633 姓名:邱飒飒 指导老师:孙文义 2012年6月8日

嵌入式系统设计性实验报告 作者:邱飒飒班级:50906 学号:5090633 摘要:在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大的提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题.该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了基于单片机的水温自动控制系统的设计该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了水温自动控制系统的设计。 关键字:水温控制单片机MC9S12DG128 一、系统设计的功能 1.1 水温控制系统设计任务和要求 该系统为一实验系统,系统设计任务: 设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。 水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。同时满足以下要求: (1)温度设定范围为40~90℃,最小区分度为1℃,标定温度≤1℃。 (2)环境温度降低时(例如用电风扇降温)温度控制的静态误差≤1℃。 (3)用十进制数码管显示水的实际温度保留一位小数。 (4)采用适当的控制方法(如数字PID),当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。 (5)温度控制的静态误差≤0.2℃。 (6)从串口输出水温随时间变化的数值。 1.2 水温控制系统部分 水温控制系统是一个过程控制系统,组成框图如下所示,有控制器、执行器、被控对象及其反馈作用的测量变送组成。 图1 控制系统框图 1.3 系统总体功能分析 本系统是一个简单的单回路控制系统,为了实现温度的测量及自动控制,根据任务要求及要求,系统由单片机系统,前向通道,后向通道,及人机通话四个模块构成。总体框图如图2 所示。

嵌入式系统实验报告

实验一系统认识实验 一、实验目的 学习Dais软件的操作,熟悉程序编写的操作步骤及调试方法。 二、实验设备 PC计算机一台,Dais-52PRO+或Dais-PRO163C实验系统一套。 三、实验内容 编写程序,将80h~8Fh共16 个数写入单片机内部RAM 的30h~3Fh空间。 四、实验步骤 1.运行Dais软件,进入集成开发环境,软件弹出设置通信端口对话框(如图2-1-1), 请确保实验装置与PC正确连接,并已打开实验装置电源,使其进入在待命状态。 这里选择与实验装置实际相连的通信端口,并单击“确定”。如通信正确则进入Dais 软件主界面,否则弹出“通信出错”的信息框(如图2-1-2),请检查后重试。 图2-1-1设置通信端口对话框图2-1-2通信错误信息框 2.通信成功后,单击菜单栏“设置”→“仿真模式”项打开对话框,选择需要设置型 号、程序/数据空间。这里我们将型号设置为“MCS-51实验系统”,外部数据区 设置为“系统RAM”,用户程序区设置为“片外(EA=0)”,如图2-1-3所示,最 后单击“确定”按钮保存设置。

图2-1-3设置工作方式对话框 3.工作方式设置完毕后,单击菜单栏“文件”→“新建”项或按Ctrl+N组合键(建 议单击工具栏“”按钮)来新建一个文件,软件会出现一个空白的文件编辑窗口。 4.在新窗口中输入程序代码(A51\2_1.ASM): ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R1,#30H ;片内RAM首地址 MOV A,#80H ;写入数据初值 MOV R7,#16 ;循环变量 LOOP1: MOV @R1,A ;写数据到片内RAM INC R1 ;地址增量 INC A ;数据+1 DJNZ R7,LOOP1 ;循环变量-1,不为0继续 SJMP $ ;结束 END 5.单击菜单栏“文件”→“保存”项(建议单击工具栏“”按钮)保存文件。若 是新建的文件尚未命名,系统会弹出文件保存对话框(如图2-1-4),提示用户选择文件保存的路径和文件名,再单击“保存”按钮。

嵌入式系统——实验3——2

实验一:基于ADS的C语言程序实验 一、实验环境 PC机一台 ADS 1.2集成开发环境一套 二、实验目的 通过实验了解使用ADS 1.2编写C语言程序,并进行调试。 三、实验内容 在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,具体的编程规则同标准C语言。 编写一个汇编程序文件Startup.s和一个C程序文件Test.c。汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后调跳转到C程序运行,这就是一个简单的启动程序。C程序使用加法运算来计算1+2+3+...+(N-1)+N的值(N>0)。 四、实验预习要求 (1)仔细阅读《ARM嵌入式系统》中第3和4章ARM指令系统的内容。 (2)仔细阅读文档《ADS集成开发环境及仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的内容。(本实验使用软件仿真) 五、实验步骤 (1)启动ADS 1.2,使用ARM Executable Image工程模板建立一个工程ProgramC。 (2)建立源文件Startup.s和Test.c,编写实验程序,然后添加到工程中。 (3)设置工程链接地址RO Base为0x40003f00,RW Base为0x40300000。设置调试入口地址Image entry point为Ox40003f00。 (4)设置位于开始位置的起始代码段,如图1-1,1-2所示。 在Layout栏中,如图1-1,在Place at beginning of image框内,需要填写项目的入口程序的目标文件名,如,整个工程项目的入口程序是Startup.s,那么应在Object/Symbol处填写其目标文件名Startup.o,在Section处填写程序入口的起始段标号Start。它的作用是通知编译器,整个项目的开始运行,是从该段开始的。

《单片机系统设计》实验报告

短学期实验报告 (单片机系统设计) 题目: 专业: 指导教师: 学生姓名: 学号: 完成时间: 成绩:

基于单片机的交流电压表设计 目录 1系统的设计要求 (2) 2系统的硬件要求 (2) 2.1真有效值转换电路的分析 (2) 2.2放大电路的设计 (3) 2.3A/D转换电路的设计 (3) 2.4单片机电路的分析 (4) 2.5显示电路 (4) 3 软件设计 (5) 3.1 软件的总流程图 (5) 3.2 初始化定义与定时器初始化流程图 (5) 3.3 A/D转换流程图 (6) 3.4 数据处理流程图 (6) 3.5 数据显示流程图 (7) 4 调试 (7) 4.1 调试准备 (7) 4.2 关键点调试 (7) 4.3 测试结果 (8) 4.4 误差分析 (8) 5结束语 (8) 5.1 总结 (9) 5.2 展望 (9) 附录1 总原理图 (10) 附录2 程序 (10) 附录3 实物图 (14)

基于单片机的交流电压表设计 ****学院 ****专业 姓名 指导老师:******* 1 设计要求 (1)运用单片机实现真有效值的检测和显示。 (2)数据采集使用中断方式,显示内容为有效值与峰值交替进行。 2 硬件设计 本系统是完成一个真有效值的测量和显示,利用AD737将交流电转换成交流电压的有效值,用ADC0804实现模数转换,再通过单片机用数码管来显示。系统原理框图如图2-1所示。系统框图由真有效值转换电路、放大电路、A/D 转换电路、单片机电路、数码管显示电路五部分。 图2-1 原理框图 2.1 真有效值转换电路 真有效值转换电路主要是利用AD737芯片来实现真有效值直流变换的,即将输入的交流信号转换成直流信号的有效值,其原理图如图2-2所示。 图2-2 真有效值转换电路 由于AD737最大输入电压为200mV, 所以需要接两个二极管来限制输入电压,起到限幅的作用。如图中D1、D2,由IN4148构成,电容C6是耦合电容,电阻R1是限流电阻。 2.2 放大电路设计 放大电路主要是利用运放uA741来进行放大,电路原理图如图2-3所示。 A/D 转换 单片机 电路 显示 电路 转换 电路 交流 信号 放大 电路

嵌入式系统和应用第三四次实验

《嵌入式系统及使用》实验第三、四次 实验一 Linux映像固化和运行 一、实验目的 熟悉ARM实验设备和Emlink-W 仿真器 掌握使用Emlink-W仿真器固化linux映射程序 二、实验内容 完成H-JTAG软件配置 固化启动映像Bootloader 固化内核映像zImage 固化根文件系统映像ramdisk 三、实验步骤 1.准备工作 将Mini2410核心板boot跳线帽闭合 连接好Emlink-W仿真器、电源线(打开电源开关,给实验箱上电)。 2.固化完整的linux系统 参见附录一文档《基于EduKit-IV出厂固化说明》中“5使用Emlink-W仿 真器固化Linux映像程序”部分 3.启动ramdisk根文件系统 最基本的Linux系统就固化成功了,可以修改vivi的启动参数来设置启动方式(出厂默认是采用yaffs根文件系统启动方式): 启动ramdisk根文件系统: vivi> param ramdisk vivi> param save 启动yaffs根文件系统: vivi> param reset vivi> param save 启动nfs根文件系统: vivi> param set linux_cmd_line "root=/dev/nfs nfsroot=192.192.192.190:/home/example/nfs ip=192.192.192.200:192.192.192.190:192.192.192.1:255.255.255.0:EDUK4:eth1:off console=ttySAC1,115200 mem=64M init=/linuxrc noinitrd" vivi> param save 根据不通的vivi启动参数可以引导不同的根文件系统。 4. 根文件系统的更新 进行根文件系统的固化和更新。步骤如下: 1)在EduKit-IV实验平台中,Mini2410-IV核心子板中运行的Linux采用了“双根文件系统”的技术,MTD2分区存放ramdisk根文件系统,MTD3分区存放yaffs根文件系统。对于正常使用的用户而言,可见的文件系统是yaffs根文件系统,只有在该文件系统崩溃的时候,才通过修改vivi参数启动ramdisk根文件系统,来恢复更新yaffs根文件系统。同时在Linux映像固化的时候,yaffs根文件系统也是通过ramdisk文件系统更新的。下面的步骤将介绍通过

江苏科技大学嵌入式实验报告

实验一熟悉嵌入式系统开发环境 一、实验目的: 1.熟悉嵌入式系统硬件实验平台 2.掌握超级终端配置方法。 3. 掌握嵌入式系统开发环境配置,ARM-Linux下NFS服务器的配置方法 4. 掌握常用的 Linux下shell命令 二、实验设备及工具: 硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。 软件:PC机操作系统REDHAT LINUX 9.0 、MINICOM 、AMRLINUX开发环境 三、实验内容 : (1)掌握嵌入式系统实验平台上的各类借接口的位置; (2)配置windows的超级终端,熟悉vivi的命令行,bootload、kernel、root 和用户程序的介绍; (3)配置linux的终端,配置网络服、Ip地址,开发目录共享,挂载等。 四、实验步骤: 1.掌握嵌入式系统实验平台上的各类接口的位置 UP-TECH S2410/P270 DVP 的硬件配置如表 1.2.1 所示 实物如图 1.2.1 所示:

2.配置windows的超级终端,熟悉vivi的命令行,bootload、kernel、root 和用户程序的介绍; 1)配置windows的超级终端: a)用串口线将 PC 机与 ARM 开发板连接好后,将 UP-TECH S2410、P270 DVP 开发板 开机,然后点击 PC 机上的开始“菜单”然后找到“附件”中“通讯”选项中的“超级终端”, b)然后在超级终端里进行配置,在“名称”中输入要建立的超级终端的名字。 c)在“连接时使用”一栏选择可用的串口号,(这里根据自己的实际情况进行选择)。 d)在“每秒位数”中选择“115200”,“数据流控制”选择“无”,然后点击“确定”按 钮,设置完毕。 2)学习并掌握如下命令: ls,cd ,pwd,cat,more,less,mkdir,rmdir ,rm,mv,cp,tar,ifconfig 3. Linux下minicom的使用与程序挂载 a)打开虚拟机,启动linux; b)新建终端,输入minicom来启动实验箱;

嵌入式系统原理实验五按键实验

实验五按键输入实验 实验目的: 利用板载的 4 个按键,来控制板载的两个LED 的亮灭和蜂鸣器的开关。通过本实验,将了解到STM32F1 的IO 口作为输入口的使用方法。 内容要点: 1.STM32 IO 口简介 STM32F1 的IO 口在上一章已经有了比较详细的介绍,这里我们不再多说。STM32F1 的IO口做输入使用的时候,是通过调用函数GPIO_ReadInputDataBit()来读取IO 口的状态的。了解了这点,就可以开始我们的代码编写了。这一个实验,我们将通过ALIENTEK 战舰STM32 开发板上载有的 4 个按钮(WK_UP、KEY0、KEY1 和KEY2),来控制板上的2 个LED(DS0 和DS1)和蜂鸣器,其中WK_UP 控制蜂鸣器,按一次叫,再按一次停;KEY2 控制DS0,按一次亮,再按一次灭;KEY1 控制DS1,效果同KEY2;KEY0 则同时控制DS0 和DS1,按一次,他们的状态就翻转一次。有源蜂鸣器自带了震荡电路,一通电就会发声 2.硬件设计 本实验用到的硬件资源有: 1)指示灯 DS0、 DS1 2) 4 个按键: KEY0、 KEY1、 KEY2、和 WK_UP。 DS0、 DS1 以及蜂鸣器和 STM32 的连接在上两章都已经分别介绍了,在战舰 STM32 开发 板上的按键 KEY0 连接在 PE4上、KEY1 连接在 PE3上、KEY2 连接在 PE2上、WK_UP 连接在 PA0上。如图所示: 按键与STM32 连接原理图 这里需要注意的是: KEY0、 KEY1 和 KEY2 是低电平有效的,而 WK_UP 是高电平有效的,并且外部都没有上下拉电阻,所以,需要在 STM32 内部设置上下拉。 3.软件设计 key.h #ifndef __KEY_H #define __KEY_H #include "sys.h" #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1 #define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) #define KEY0_PRES 1 //KEY0 按下 #define KEY1_PRES 2 //KEY1 按下 #define KEY2_PRES 3 //KEY2 按下 #define WKUP_PRES 4 //WK_UP 按下(即WK_UP/WK_UP) void KEY_Init(void); //IO 初始化 u8 KEY_Scan(u8); //按键扫描函数

嵌入式系统设计实验报告

西安邮电大学 嵌入式系统设计实验报告 专业 班级 学号 学生姓名 指导教师 学期2013-2014学年第2学期 完成日期2014-06-25

基于lpc2131的模拟电梯控制实验 一、实验目的 1、熟悉ARM & ADS V1.2 的环境 2、理解LPC2131芯片引脚功能的选择 3、理解GPIO的使用设置、输入驱动方法 4、理解SPI全双工同步串行通信原理,学习ARM SPI资源的驱动编程 5、学习在LPC2131上移植ucosⅡ系统 二、实验内容及要求 1、通过键盘输入楼层,输入之后数码管从当前位置向上或向下运行,流水灯表示运动方向。 2、流水灯在运行中显示电梯正在运行的方向,并且在电梯到达时在该楼层闪烁3次。 3、电梯运行到对应楼层,数码管显示楼层号。 4、流水灯表示电梯运行楼层。 5、系统可同时满足多用户需求。达到该系统与现实电梯系统的一致性。 三、系统总体设计(总体方案及系统框图) 主要是创建了四个任务,分别为电梯总任务、按键检测任务、电梯方向改变任务及电梯向上或向下运行任务,然后启动多任务环境,通过事件标志组发送和接收消息,进而实现电梯的一些基本的功能。

四、系统详细设计(模块详细设计及流程图)

五、系统测试(数据测试结果及分析) 通过键盘按键输入楼层数,发送到开发板,数码管和LED灯初始化时会停留在电梯的第一层。接受到数据后数码管会自动变化到该楼层,并且LED灯在数码管变化的同时会显示电梯当前的运动状态,上或者下。在程序运行的任何期间都可以从键盘输入电梯的楼层数。而且程序会自动判断要满足的用户的优先级。 此次试验达到的效果基本与现实中电梯的运行模式达到了一致。六、总结 在整个课程设计中,我们组员一起认真地查找相关资料,然后又对书中的相关内容仔细翻阅,通过虚心请教和不懈的努力,最终完成了整个设计,心中的喜悦实在无以言表。此刻,我非常感谢我们组长的鼓励和帮助,感谢同学们诸多的帮助!本次设计不仅让我收获了许多,也让我对以前所学习的ARM知识有了进一步的深化与巩固,最关键的是,它给了我一份自信。但我很明白,作品中还存在着比较多的不足,这些都需要进一步的改善,我会不骄傲,不气馁,用着自信与执着尽最大努力将其完善。 七、附录(代码+注释) #include "config.h" #include "stdlib.h" #define KEY1 1 << 16 // P0.16连接KEY1 #define KEY2 1 << 17 // P0.17连接KEY2 #define KEY3 1 << 18 // P0.18连接KEY3 #define KEY4 1 << 19 // P0.19连接KEY4 #define KEY5 1 << 20 // P0.20连接KEY5 #define KEY6 1 << 21 // P0.21连接KEY6

嵌入式系统设计实验六

实验六 8字数码管和点阵数码管实验....................... 错误!未定义书签。 实验目的............................................. 错误!未定义书签。 实验内容............................................. 错误!未定义书签。 预备知识............................................. 错误!未定义书签。 实验设备及工具....................................... 错误!未定义书签。 实验原理............................................. 错误!未定义书签。 、程序分析........................................... 错误!未定义书签。 实验步骤............................................. 错误!未定义书签。 八、思考题........................................... 错误!未定义书签。实验六 8字数码管和点阵数码管实验 实验目的 学习LED的相关知识 掌握74HC273芯片的工作原理 了解SPI接口的相关知识 实验内容 学习LED相关知识,了解74HC273芯片对LED点亮的工作机制,熟练阅读74HC273芯片资料,掌握对它的使用。 预备知识 有C语言基础 掌握在Linux下常用编辑器的使用 掌握Makefile 的编写和使用 掌握Linux下的程序编译与交叉编译过程 需要部分数字电路的知识

中北大学嵌入式系统实验报告

中北大学计算机与控制工程学院实验报告《嵌入式系统实验报告》 专业电气工程与智能控制 班级 14070541 学号 1407054103 姓名贾晨凌

实验一 ARM 处理器指令系统实验 一、实验目的 熟悉ARM指令系统,熟悉ARM SDT编辑编译连接,ARM Project Manager和ARM Debugger 的设置和使用 二、实验条件 Windows平台的ARM SDT 2.51软件:ARM Project Manager和ARM Debugger。 三、实验内容 学习使用ARM Project Manager建立项目文件,编辑汇编文件,并加入项目。学习ARM编译器和汇编器的设置。通过编程熟悉ARM指令,包括跳转指令,数据处理指令,状态寄存器传送指令,load/store指令,中断异常产生指令。学习ARM调试起的使用方法,包括程序的导入,单步执行,断点设置等。 四、实验要点 工程文件的建立,在ARM Project Manager中点击File->New,选择Project,点击确定。 链接器的设定,需要设置代码和数据段的起始地址。 点击图标,选择不进行远程调试,即可打开调试器。 五、实验结果 熟悉ARM指令系统 实验二p1口实验 一、实验目的 熟悉 ARM SDT 软件开发方法和技能;

学习和巩固 ARM 指令集; 学习和巩固汇编语言程序设计 二、实验条件 Windows 平台的 ARM SDT 2.51 软件:ARM Project Manager 和 ARM Debugger; DebugServer.exe ; EFLAG-ARM-S3C44B0 实验箱 三、实验内容 目录 ARM251\EXAMPLES\ASM 下的汇编程序, 学习和调试代码,分析所得结果。 在调试器上仿真软件的执行。 在实验箱上,调试软件,并观察软件的执行结果 四、实验要点 在调试软件目录中启动 DebugServer.exe 调试器服务程序。 启动 SDT 调试软件 ARM Debugger。 五、实验结果

2014完整ARM嵌入式系统实验报告

郑州航空工业管理学院 嵌入式系统实验报告 (修订版) 20 – 20第学期 赵成,张克新编著 院系: 姓名: 专业: 学号: 电子通信工程系 2014年3月制

实验一ARM体系结构与编程方法 一、实验目的 了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。 二、实验内容 1.ADS1.2 IDE的安装、环境配置及工程项目的建立; 2.ARM汇编语言程序设计(参考附录A): (1)两个寄存器值相加; (2)LDR、STR指令操作; (3)使用多寄存器传送指令进行数据复制; (4)使用查表法实现程序跳转; (5)使用BX指令切换处理器状态; (6)微处理器工作模式切换; 三、预备知识 了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:ARM Developer Suite (ADS) 1.2。 五、实验分析 1.安装的ADS1.2 IDE中包括和两个软件组件。在ADS1.2中建立类型的工程,工程目标配置为;接着,还需要对工程进行、及链接器设置;最后,配置仿真环境为仿真方式。 2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。 ; 文件名:

基于stm32的嵌入式系统原理与设计实验报告 学位论文

XXXX学院 XX级嵌入式系统设计实验报告 班级: 指导老师: 学期: 小组成员: 姓名学号 组长 成员 成员

实验一我的第一个工程实验 一.实验简介 我的第一个工程,流水灯实验 二.实验目的 掌握STM32开发环境,掌握从无到有的构建工程。 三.实验内容 熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现流水灯工程。通过ISP下载代码到实验板,查看运行结果。使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。 四.实验设备 硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。 软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。 五.实验步骤 1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件 4.建立工程目录,复制库文件 5.建立和配置工程 6.编写代码 7.编译代码 8.使用ISP下载到实验板 9.测试运行结果 10.使用JLINK下载到实验板 11.单步调试 12.记录实验过程,撰写实验报告

六.实验结果及测试七.实验总结

实验二带按键控制的流水灯实验 一.实验简介 在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。二.实验目的 熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。 三.实验内容 实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。 使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。四.实验设备 硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。 软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。 五.实验步骤 1在实验1代码的基础上,编写中断初始化代码 2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序 3编写中断服务程序 4编译代码,使用JLINK下载到实验板 5.单步调试 6记录实验过程,撰写实验报告

北邮嵌入式系统设计实验-实验报告

嵌入式实验报告 学院:xxx 班级:xxx 学号:xxx 姓名:xxx 成员:xxx

一、基础知识部分 1.多线程实验 本章主要讲解线程的概念和线程间的同步方式。实验一主要介绍线程的概念和线程的创建,实验二、实验三、实验四分别介绍了信号量、互斥锁、条件变量的作用和使用。 1.1 线程的介绍 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。 线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与普通函数没有太多区别。线程的创建函数如下: ●创建线程失败,函数返回非0的错误代码,成功返回0; ●*thread pthread_t类型的缓冲区,保存一个线程的线程ID; ●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性; ●*(*start_routine) 线程入口函数函数名 ●*arg 向所创建线程传入的参数 1.2 信号量的概念 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。 信号量是一个在进程和线程中都可以使用的同步机制。信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。当接收通知的线程没有收到通知前,会处于阻塞状态。 信号量可以连续发送多次,处理线程同样也会处理多次。信号量实质是一个计数器,信号量发送一次,计数值增加1,信号量每获取一次,计数值就减1,当计数值为0时,等待信号量线程阻塞。等待信号量过程中,还可以设置等待时间,超过设定时间,等待信号量的线程就不会继续等待,而是继续执行后续任务。

相关文档
相关文档 最新文档