嵌入式实验报告流水灯
浩铭科技工作室 下属中国莲溪
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
院发布技术文档 版权所有
LED流水灯
一、【实验目的】
1、掌握基本的ARM中C语言编程方法. 深入理解ARM开发环境的体系结构。 2、演示程序的效果,并对程序结果进行
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
。
3、熟悉并掌握windows平台下的嵌入式开发的基本步骤和原理,并对嵌入式系统有更深入的了解。
二、【实验步骤】
一、打开Virtual Machine虚拟机软件,在打开的软件中打开存在的虚拟机或分组,并在E盘中找到ubuntu系统打开。
二、安装交叉编译器
1、将cross-4.2.2-eabi.tar.bz2文件拷贝到Ubuntu的/forlinux目录下。在Uuntu中新建一个终 端,输入下面的命令安装交叉编译器:
#cd /forlinux (进入/forlinux目录)
#mkfir /usr/local/arm (创建目录,若目录存在会提示错误,跳过即可)
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
#tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/arm (编译器解压到
/usr/local/arm)
2、完成解压后将在/usr/local/arm目录下生成“4.2.2-eabi”目录。
三、挂载NFS文件系统目录
1、启动nfs服务之前,必须在Ubuntu上准备好NFS共享目录。
例如我们采用Ubuntu的“/forlinux/root”作为NFS共享目录,就需要将
“FORLINX_6410_yaffs2_v1.0.tgz”压缩文件拷贝到这个目录下,然后解压缩,得
到根文件系统所需要的目录。
2、在Ubuntu上打开一个终端,输入以下命令:#mkdir /forlinux/root
3、将FORLINX_6410_yaffs2_v1.0.tgz文件拷贝到该目录下,
4、解压命令:#tar -zxf FORLINX_6410_yaffs2_v1.0.tgz
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
四、启动超级终端
1、启动开始—附件—通讯—超级终端。
2、在超级终端弹出的连接描述中输入111作为名称,接着选择第一个电话图案,接着点击确定。
3、在弹出的COM1属性窗口中选择每秒位数为115200,数据位为8,奇偶校验为无,,停止位为1,数据流控制为无,然后点击确定。如下图所示
4、完成配置后,用串口线连接开发板的COM1,接着在打开开发板的电源时立刻不断敲键盘的空格键。这时,超级终端里面完成一些配置后停住,我们在 SMDK6410 #setenv bootargs "root=/dev/nfs
nfsroot=172.43.24.140:/forlinux/root ip=172.43.24.141:172.43.24.140:172.43.24.0:255.255.255.0::eth0:
console=ttySAC0,
115200".
5、保存 SMDK6410 # saveenv
6、重新启动开发板,Linux内核启动后会自动挂载NFS文件系统。
五、LED驱动
1、编写LED驱动程序myled.c
2、编写Makefile
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
3、编写应用程序myled_app.c
4、在Ubuntu的forlinux目录下新建一个led目录把上面编写的3个文件拷贝到led目录下,在led目录下输入make编译myled.c生成myled.ko。
5、用交叉编译工具链编译应用程序myled_app.c,在nfs的共享目录/forlinux/root新建myled目录,并把myled_app,myled.ko拷贝到led目录下
6、开发板上电,进入myled目录,加载myled模块使用insmod,最后输入./app number
运行程序,观察led的变化。
三、【Makefile文件分析】
obj-m := myled.o //目标文件:myled.o
KDIR := /linux2.6.28 //内核路径
all:
make -C $(KDIR) M=$(PWD) modules //在内核路径KDIR := /linux2.6.28下生成myled.o
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order//删除这些后缀的文件
四、【驱动程序分析】
1、打开设备并初始化设备
static int __init Led_init(void) {
int ret;
/* 实现地址映射*/
Clock_Address=ioremap(SEG_LED, 1);
Led_Address=ioremap(LED_DATE, 1);
Gpkcon_Address=ioremap(GPKCON0, 1);
Gpkpud_Address=ioremap(GPKPUD, 1);
Gpmcon_Address=ioremap(GPMCON, 1);
Gpmpud_Address=ioremap(GPMPUD, 1);
ret= register_chrdev(Led_MAJOR, DEVICE_NAME, &Led_fops);//注册设备
if (ret < 0) {
printk(DEVICE_NAME " can't get major number\n");
return ret;
}
else
return 0;
}
static int release(struct inode *inode, struct file *filp)
{
return 0;
}
static struct file_operations Led_fops = {
open: Led_open,
write: Led_write,
release: Led_release,
owner: THIS_MODULE,
};
2、设备注册以及地址映射
static int __init Led_init(void) {
int ret;
/*地址映射*/
Clock_Address=ioremap(SEG_LED, 1);
Led_Address=ioremap(LED_DATE, 1);
Gpkcon_Address=ioremap(GPKCON0, 1);
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
Gpkpud_Address=ioremap(GPKPUD, 1);
Gpmcon_Address=ioremap(GPMCON, 1);
Gpmpud_Address=ioremap(GPMPUD, 1);
/*注册设备*/
ret= register_chrdev(Led_MAJOR, DEVICE_NAME, &Led_fops);
if (ret < 0) {
printk(DEVICE_NAME " can't get major number\n");
return ret;
}
else
return 0;
}
3、更新数据
/*控制LED点亮函数*/
static void Updateled(void)
{
writew(Led_Buff, Led_Address);//将Led_Buff参数传给寄存器
printk("Led_Buff=%2x\r\n",Led_Buff);
printk("Led_Address=%2x\r\n",*Led_Address);
writew(0x00, Clock_Address);
printk("Clock_Address_1=%2x\r\n",*Clock_Address);
writew(0x08, Clock_Address);
printk("Clock_Address_2=%2x\r\n",*Clock_Address);
return;
}
4、向设备写数据并调用Update更新
static ssize_t Led_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
{
if(count!=1)
{
printk(KERN_EMERG "the count of input is not one!!");
return 0;
}
printk("%2x\r\n",*buffer);
copy_from_user(&Led_Buff, buffer, 1);//buffer是应用层传进来的参数
Updateled();//调用Updateled()函数更新数据
return 1;
}
5、卸载模块
/* 实现驱动模块退出函数与模块描述 */
static void __exit Led_exit(void)
{
/*取消映射*/
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
iounmap(Led_Address);
iounmap(Clock_Address);
iounmap(Gpkcon_Address);
iounmap(Gpkpud_Address);
iounmap(Gpmcon_Address);
iounmap(Gpmpud_Address);
unregister_chrdev(Led_MAJOR, DEVICE_NAME); }
6、应用程序实现
首先定义一个文件描述符fd和流水灯的初始值ledvalue,然后调用open(LED_DEV, O_RDWR)函数,其中第一个为参数打开文件的全路径,第二参数
的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示打开模式,此时为可读可写,open 函数如果成功打开文件,返回一个>0随机文件描述符,否则返回-1,根据fd来判断是否成功打开了文件。当确定文件已打开后先讲取反赋值给tmp,把tmp传给驱动层,控制LED灯,然后执行write(fd, &ledvalue, 1)函数,再将ledvalue右移或者左移一位(向哪个方向移动取决于我们做的一个菜单中你的选择),其中第一个参数表示写入的文件,第二个参数是需要写入的数据地址,第三个参数表示写入的字节数。取反如此循环即可实现流水灯,将ledvalue取反的好处是使始终只有一盏灯亮。具体实现程序如下: #include
#include
//#include
#include
#include
#include
#include
#include
#include
#define LED_DEV "/dev/s3c6410_Led" bool bstop=false;
int fd;
void display_menu()
{
printf("********Choice Menu*********\n");
printf(" [0] Open Device\n");
printf(" [1] Left Shift\n");
printf(" [2] Right Shift\n");
printf(" [T] Stop Shift\n");
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
printf(" [C] Close Device\n");
printf(" [x] Exit Test\n");
printf(" ***********************\n");
printf(" Please input your choise: ");
}
void *Led_Right_Shift(void *data) {
unsigned char ledvalue=0x01;
unsigned char tmp;
int i=0;
while(1) {
for(i=0;i<8;i++){
if(bstop) {
bstop=false;
return;
}
tmp=~ledvalue;
write(fd,&tmp,1);
//printf("%2x\r\n",tmp);
sleep(1);
if(i<7)
ledvalue=ledvalue<<1;
else
ledvalue=0x01;
}
}
}
void *Led_Left_Shift(void *data) {
unsigned char ledvalue=0x80;
unsigned char tmp;
int i=0;
while(1)
{
for(i=0;i<8;i++)
{
if(bstop)
{
bstop=false;
return;
}
tmp=~ledvalue;//取反
write(fd,&tmp,1);//传递数值给驱动层
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
//printf("%2x\r\n",tmp);
sleep(1);//系统休眠1秒
if(i<7)
ledvalue=ledvalue>>1;
else
ledvalue=0x80;
}
}
}
int main(int argc, char **argv) {
fd=-1;
pthread_t th_shift=0;
char ch=0x00;
display_menu();
void *retval;
while(1) {
ch=getchar();
switch(ch) {//输入字符选择模式
case '0':
if(fd>0)
printf("##Led Device has been open##%d \n",fd);
else {
fd = open(LED_DEV, O_RDWR);
if(fd < 0)
printf("####LED Device open Fail####\n");
else
printf("####LED Device open Success####%d \n",fd);
}
display_menu();
break;
case '1':
if(fd) {
if(th_shift) {
bstop=true;
pthread_join(th_shift,&retval);
}
bstop=false;
pthread_create(&th_shift,NULL,Led_Right_Shift,NULL);
}
else
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
printf("The device is not open!!");
display_menu();
break;
case '2':
if(fd) {
if(th_shift) {
bstop=true;
pthread_join(th_shift,&retval);
}
bstop=false;
pthread_create(&th_shift,NULL,Led_Left_Shift,NULL);
}
else
printf("The device is not open!!");
display_menu();
break;
case 't':
case 'T':
bstop=true;
display_menu();
break;
case 'c':
case 'C':
if(fd)
close(fd);
display_menu();
bstop=false;
break;
case 'x':
case 'X':
exit(1);
default:
break;
}
}
return(0);
}
五、【
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
】
在一个学期的嵌入式课程的学习中,我掌握了嵌入式课程的基本知识,为我以后学习嵌入式打下坚实的基础~我们主要接触了嵌入式的开发环境,并学习了
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有 其开发步骤。
本次的实验学习是一个新的认识、新的挑战。在此过程中我们不但应用了所学的知识,还不断地学习到了新知识和工具来完成
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的需要,在设计的过程中,我深深体会到了学习嵌入式的不易,为了实现一个模块的代码,为了一个设计的实现思想,经常绞尽脑汁来达到设计所要达到的目标,在本次的学习期间,我们积累了许多宝贵的经验,这都是我们以后走上工作岗位的巨大的财富。
感谢黄俊老师老师,以及各位师兄们本学期对我们的细心指导与帮助,使我们受益匪浅。通过本学期嵌入式实验的学习,相信也会带给我们今后学习生活上很大的帮助。
附录?(驱动程序代码):
/* led driver based on s3c6410 */ #include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
//#include
#define DEVICE_NAME "s3c6410_Led"
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
#define SEG_LED 0x7F008824 //led CS is NLED4/GPM3
#define LED_DATE 0x7F008808
#define GPKCON0 0x7F008800
#define GPKPUD 0x7F00880C
#define GPMCON 0x7F008820
#define GPMPUD 0x7F008828
#define Led_MAJOR 60
static char Led_Buff=0x0;
unsigned long * Led_Address;
unsigned long * Clock_Address;
unsigned long * Gpkcon_Address;
unsigned long * Gpkpud_Address;
unsigned long * Gpmcon_Address;
unsigned long * Gpmpud_Address;
/*控制LED点亮函数*/
static void Updateled(void)
{
writew(Led_Buff, Led_Address);
printk("Led_Buff=%2x\r\n",Led_Buff);
printk("Led_Address=%2x\r\n",*Led_Address);
writew(0x00, Clock_Address);
printk("Clock_Address_1=%2x\r\n",*Clock_Address);
writew(0x08, Clock_Address);
printk("Clock_Address_2=%2x\r\n",*Clock_Address);
return;
}
/*实现LED驱动写操作函数*/
static ssize_t Led_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
{
if(count!=1)
{
printk(KERN_EMERG "the count of input is not one!!");
return 0;
}
printk("%2x\r\n",*buffer);
copy_from_user(&Led_Buff, buffer, 1);
Updateled();
return 1;
}
/* 实现LED驱动的打开、释放函数以及文件操作结构体 */
static int Led_open(struct inode *inode, struct file *filp)
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有 {
writel(0x11111111, Gpkcon_Address);
writel(0x00000000, Gpkpud_Address);
writew(0x0000, Led_Address);
writel(0x111111, Gpmcon_Address);
writel(0x000, Gpmpud_Address);
writew(0x08, Clock_Address);
return 0;
}
static int Led_release(struct inode *inode, struct file *filp)
{
return 0;
}
static struct file_operations Led_fops = {
open: Led_open,
write: Led_write,
release: Led_release,
owner: THIS_MODULE,
};
/* 实现LED驱动初始化函数 */
static int __init Led_init(void) {
int ret;
Clock_Address=ioremap(SEG_LED, 1);
Led_Address=ioremap(LED_DATE, 1);
Gpkcon_Address=ioremap(GPKCON0, 1);
Gpkpud_Address=ioremap(GPKPUD, 1);
Gpmcon_Address=ioremap(GPMCON, 1);
Gpmpud_Address=ioremap(GPMPUD, 1);
ret= register_chrdev(Led_MAJOR, DEVICE_NAME, &Led_fops);
if (ret < 0) {
printk(DEVICE_NAME " can't get major number\n");
return ret;
}
else
return 0;
}
/* 实现驱动模块退出函数与模块描述 */
static void __exit Led_exit(void) {
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
iounmap(Led_Address);
iounmap(Clock_Address);
iounmap(Gpkcon_Address);
iounmap(Gpkpud_Address);
iounmap(Gpmcon_Address);
iounmap(Gpmpud_Address);
unregister_chrdev(Led_MAJOR, DEVICE_NAME);
}
module_init(Led_init);
module_exit(Led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR(" keane ");
MODULE_DESCRIPTION("This is a Led driver demo");
附录?(Makefile代码):
obj-m := myled.o //目标文件:myled.o
KDIR := /linux2.6.28 //内核路径
all:
make -C $(KDIR) M=$(PWD) modules //在内核路径KDIR := /linux2.6.28下生成myled.o
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order//删除这些后缀的文件
附录?(测试程序代码):
#include
#include
//#include #include
#include
#include
#include
#include
#include
#define LED_DEV "/dev/s3c6410_Led" bool bstop=false;
int fd;
void display_menu()
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有 {
printf("********Choice Menu*********\n");
printf(" [0] Open Device\n");
printf(" [1] Left Shift\n");
printf(" [2] Right Shift\n");
printf(" [T] Stop Shift\n");
printf(" [C] Close Device\n");
printf(" [x] Exit Test\n");
printf(" ***********************\n");
printf(" Please input your choise: "); }
void *Led_Right_Shift(void *data) {
unsigned char ledvalue=0x01;
unsigned char tmp;
int i=0;
while(1) {
for(i=0;i<8;i++){
if(bstop) {
bstop=false;
return;
}
tmp=~ledvalue;
write(fd,&tmp,1);
//printf("%2x\r\n",tmp);
sleep(1);
if(i<7)
ledvalue=ledvalue<<1;
else
ledvalue=0x01;
}
}
}
void *Led_Left_Shift(void *data) {
unsigned char ledvalue=0x80;
unsigned char tmp;
int i=0;
while(1)
{
for(i=0;i<8;i++)
{
if(bstop)
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
{
bstop=false;
return;
}
tmp=~ledvalue;//取反
write(fd,&tmp,1);//传递数值给驱动层
//printf("%2x\r\n",tmp);
sleep(1);//系统休眠1秒
if(i<7)
ledvalue=ledvalue>>1;
else
ledvalue=0x80;
}
}
}
int main(int argc, char **argv) {
fd=-1;
pthread_t th_shift=0;
char ch=0x00;
display_menu();
void *retval;
while(1) {
ch=getchar();
switch(ch) {//输入字符选择模式
case '0':
if(fd>0)
printf("##Led Device has been open##%d \n",fd);
else {
fd = open(LED_DEV, O_RDWR);
if(fd < 0)
printf("####LED Device open Fail####\n");
else
printf("####LED Device open Success####%d \n",fd);
}
display_menu();
break;
case '1':
if(fd) {
if(th_shift) {
bstop=true;
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
pthread_join(th_shift,&retval);
}
bstop=false;
pthread_create(&th_shift,NULL,Led_Right_Shift,NULL);
}
else
printf("The device is not open!!");
display_menu();
break;
case '2':
if(fd) {
if(th_shift) {
bstop=true;
pthread_join(th_shift,&retval);
}
bstop=false;
pthread_create(&th_shift,NULL,Led_Left_Shift,NULL);
}
else
printf("The device is not open!!");
display_menu();
break;
case 't':
case 'T':
bstop=true;
display_menu();
break;
case 'c':
case 'C':
if(fd)
close(fd);
display_menu();
bstop=false;
break;
case 'x':
case 'X':
exit(1);
default:
break;
}
}
return(0);
}
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335
浩铭科技工作室 下属中国莲溪书院发布技术文档 版权所有
=================================================================================
浩铭科技工作室 专心 专业 共赢 奉献 qq:1817439335