超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”
版权声明:本文为博主原创文章,未经博主同意不得转载。转载联系 QQ 30952589,加好友请注明来意。
https://blog.csdn.net/sleks/article/details/25158121
这里转载一篇 linux 下的驱动程序开发的非常基础和实用的文章 在pcduino开发板上写驱动控制板载LED的闪烁 ,实际是一个linux的驱动,该篇文章基础且够用;兴许找到
android 下的驱动开发相关文章,再补充进来,希望该文作者能再接再励,感谢于先。
这里用 原创 模式,以便能推荐给很多其它的爱好者,转载是无法推荐的。敬请谅解。
下面仅是对原作者文章的整版复制。因为工作较忙,尚无时间细整理当中的代码,急用的可通过上面的链接跳转至原作者博客。
因为关于pcduino的资料比較少。所以这篇文章是參考了pcduino爱好者论坛的一篇教程《手把手教你用A10点灯》。而且系统的结合了linux驱动的开发步骤。
读完这篇文章,你不但能够对pcduino开发板的硬件结构有所了解,更重要的是能够对linux的驱动开发步骤有一个系统的认识。我也是一个linux驱动的新手,所以。写的不正确的地方,请大家指正。
1.Linux驱动框架
这一部分将会手把手教你创建一个Linux的驱动程序框架,在下一部分,我们仅仅须要将控制pcduino硬件部分的代码填入这个框架就能够了。像全部的应用程序都有一个main函数作为函数的入口一样,linux驱动程序的入口是驱动的初始化函数。这个初始化函数是 module_init 来指定的。相同。与初始化函数相应的驱动程序的退出函数是由 module_exit函数来指定的。以下就让我们动手写第一个版本号的驱动程序吧。
- #include <linux/module.h>
- #include <linux/init.h>
- static int __init led_init(void)
- {
- printk("led init\n");
- return 0;
- }
- static void __exit led_exit(void)
- {
- printk("led exit\n");
- }
- module_init( led_init );
- module_exit( led_exit );
将上面代码保存为 led.c,接下来就要编写Makefile文件对刚刚编写的驱动程序进行编译了。新建Makefile文件,在里面输入:
- obj-m := led.o
- all:
- make -C /usr/src/linux-headers-3.8.0-35-generic/ M=/home/asus/drive/
- clean:
- rm *.o
- rm *.ko
- rm *.order
- rm *.symvers
- rm *.mod.c
注意,Makefile 中的第三行,-C 后面的參数为你当前使用的内核的头文件所在的文件夹,你仅仅须要改动为 "/usr/src/linux-headers-你的内核版本号/" 就可以,假设你不知道,当前使用的内核版本号。能够输入:
- uname -r
来进行查看。M 后面表示你的驱动所在的文件夹。
改好之后保存,注意,这个文件的名字一定得是 "Makefile" 才行,make 和 rm命令前面一定是一个TAB符才行。输入命令:
- make
进行编译。完毕之后,使用ls查看。能够看到得到的文件例如以下:
- built-in.o led.c led.ko led.mod.c led.mod.o led.o Makefile modules.order Module.symvers
这里面的 led.ko 是我们得到的驱动文件。使用:
- sudo insmod led.ko
安装驱动。
使用
- dmesg
命令,会看到最后一行输出的是 “led init” ,这句话就是在 led_init 函数中输出的。使用命令:
- sudo rmmod led.ko
来卸载 led 驱动。再使用: dmesg 命令。会发现,最后一行为 “led exit”。
上面写的这个驱动程序是没有什么作用的,在linux中,应用程序是通过设备文件来和驱动程序进行交互的。
所以我们须要在驱动程序中建立设备文件,这个设备文件建立之后。就会存在于 /dev/ 文件夹下,应用程序就是通过对这个文件的读写。来向驱动程序发送命令,并通过驱动程序控制硬件的动作。每个驱动程序相应着一个设备文件。要建立一个设备文件。首先必须拥有设备号才行。这个设备号就须要我们向linux系统提出申请。由linux系统为我们分配。设备号有主设备号和从设备号之分,主设备号使用来表示驱动的类型,从设备号表示使用同一个驱动的设备的编号,这里要申请的就是主设备号。
使用
alloc_chrdev_region 函数来申请一个设备号。设备号的类型为 dev_t 。它是一个 32 位的数,当中 12 位用来表示主设备号,另外 20 位用来表示从设备号。
能够使用 MAJOR 宏和 MINOR 宏来直接获取主设备号和从设备号。
我们第二个版本号的程序例如以下:
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- //驱动名
- #define DEV_NAME "led"
- //从设备的个数
- #define DEV_COUNT 1
- //声明设备号
- static dev_t dev_number;
- //初始化
- static int __init led_init(void)
- {
- //错误标记
- int err;
- printk("led init\n");
- //申请设备号
- err = alloc_chrdev_region(&dev_number,0,DEV_COUNT,DEV_NAME);
- if(err)
- {
- printk("alloc device number fail\n");
- return err;
- }
- //假设申请成功,打印主设备号
- printk("major number : %d\n",MAJOR(dev_number));
- return 0;
- }
- static void __exit led_exit(void)
- {
- printk("led exit\n");
- //注销申请的设备号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- }
这个程序申请了一个设备号,而且打印出来。相同使用 dmesg 命令来查看,程序的凝视已经非常具体了。就不再多解释了。
保存之后,编译,安装新的驱动程序。在安装新的驱动程序之前,须要使用命令 sudo rmmod led.ko 将之前安装的驱动程序卸载。使用 dmesg 命令查看输出的结果:
- [ 384.225850] led init
- [ 384.225854] major number : 250
还能够使用命令 cat /proc/devices | grep ‘led’ 查看获得的设备号。
设备号申请完成后,就能够在 /dev/ 文件夹下创建设备文件了。须要了解的是设备在内存中,使用结构体 cdev 来表示,而且将我们申请的设备号,以及对文件操作的回调函数,统统的关联起来。最后使用这个结构体。用函数 class_create 和 device_create 来创建一个设备文件。说了一下基本思路,还是先看程序吧:
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/cdev.h>
- #include <linux/device.h>
- //驱动名
- #define DEV_NAME "led"
- //从设备的个数
- #define DEV_COUNT 1
- //三个回调函数,当在应用程序运行对应的操作时
- //驱动程序会调用对应的函数来进行处理
- ssize_t led_write(struct file *, const char __user *, size_t, loff_t *);
- int led_open(struct inode *, struct file *);
- int led_release(struct inode *, struct file *);
- //声明设备号
- static dev_t dev_number;
- //设备在内存中表示的结构体
- static struct cdev* cdevp;
- //注冊文件操作的回调函数的结构体
- static struct file_operations fops =
- {
- .owner = THIS_MODULE,
- //注冊对应的回调函数
- .open = led_open,
- .release = led_release,
- .write = led_write,
- };
- //用来创建设备文件的class
- static struct class* classp;
- //初始化
- static int __init led_init(void)
- {
- //错误标记
- int err;
- printk("led init\n");
- //申请设备号
- err = alloc_chrdev_region(&dev_number,0,DEV_COUNT,DEV_NAME);
- if(err)
- {
- printk("alloc device number fail\n");
- return err;
- }
- //假设申请成功,打印主设备号
- printk("major number : %d\n",MAJOR(dev_number));
- //给cdev结构体在内存中分配空间
- cdevp = cdev_alloc();
- //假设分配失败
- if( cdevp==NULL )
- {
- printk("cdev alloc failure\n");
- //注销前面申请的设备号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return -1;
- }
- //将cdev结构体与
- //注冊文件操作的回调函数的结构体file_operations关联起来
- cdev_init(cdevp,&fops);
- //将cdev结构体和申请的设备号关联起来
- err = cdev_add(cdevp,dev_number,DEV_COUNT);
- if(err)
- {
- printk("cdev add failure\n");
- //释放申请的cdev空间
- cdev_del(cdevp);
- //注销申请的设备编号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return err;
- }
- //给class分配空间
- classp = class_create(THIS_MODULE,DEV_NAME);
- if( classp==NULL )
- {
- printk("class create failure\n");
- //释放申请的cdev空间
- cdev_del(cdevp);
- //注销申请的设备编号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return -1;
- }
- //创建设备文件
- device_create(classp,NULL,dev_number,"%s",DEV_NAME);
- printk("/dev/%s create success\n",DEV_NAME);
- return 0;
- }
- static void __exit led_exit(void)
- {
- printk("led exit\n");
- //释放分配的class空间
- if( classp )
- {
- device_destroy(classp,dev_number);
- class_destroy(classp);
- }
- //释放分配的cdev空间
- if( cdevp )
- {
- cdev_del(cdevp);
- }
- //注销申请的设备号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- }
- module_init( led_init );
- module_exit( led_exit );
- //当在应用程序中运行 open 函数时,
- //会调用以下的这个函数
- int led_open(struct inode* pinode,struct file* pfile)
- {
- printk("led open\n");
- return 0;
- }
- //当在应用程序中运行 close 函数时,
- //会调用以下的函数
- int led_release(struct inode* pinode,struct file* pfile)
- {
- printk("led release\n");
- return 0;
- }
- //当在应用程序中调用 write 函数时,
- //会调用以下的这个函数
- ssize_t led_write(struct file* pfile,const char __user* buf,size_t count,loff_t* l)
- {
- printk("led write");
- return 0;
- }
- //指定採用的协议
- MODULE_LICENSE("GPL");
最后一行是指定採用的协议,一定得写上,否则会造成尽管编译通过,可是在安装时,会出现
- insmod: error inserting 'led.ko': -1 Unknown symbol in module
这个错误。编译。安装好,之后,我们就能够在 /dev/ 文件夹下找到 led 文件,使用命令:
- ls -l /dev/led
结果例如以下:
- crw------- 1 root root 250, 0 Dec 26 10:52 /dev/led
至此我们的linux设备驱动框架,已经全然建立起来了。接下来要做的工作,就是对 pcduino 开发板进行编程了。
2.对 pcduino 进行编程。控制 LED 闪烁
所使用的开发板是pcduino开发板,例如以下图:
这是一款开源硬件。採用的是cortex-A8的核心。板上能够安装ubuntu,android系统。我们使用的板子已经安装了 ubuntu 系统,通过 HDMI转VGA 线连接屏幕。而且通过usb接口,连接键盘和鼠标。直接在其自带的ubuntu系统上。编写驱动并执行。我们细致的查看板子。会发现板上一共带有 3 个led灯。各自是 RX_LED,TX_LED,ON_LED,分别用来指示接收。发送和电源的状态。这里我们仅仅控制 TX_LED 灯进行闪烁。
查看 pcduino 的硬件原理图。查找
TX_LED 的连接位置。例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2NhaW5pYW9zaGFuZ3hpYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">
会看到第三行 TX_LED 连接到 CPU 的PH15引脚,而且 L 即低电平时为激活状态,H 高电平时。为熄灭状态。得到这个信息说明。我们仅仅须要控制 CPU 的引脚 PH15 的状态,就能够控制 TX_LED 的状态了。
所以接下来就须要我们去查看 A10 的芯片手冊,来看一看究竟怎么控制 PH15 这个引脚。
能够看到 A10 芯片的引脚有非常多,而我们仅仅关注 PH,由于我们要控制的就是 PH15 这个引脚。这里须要的一个概念就是,对一个引脚的控制至少须要有两个寄存器。一个是控制寄存器。一个是数据寄存器。控制寄存器用来控制引脚的工作模式,比方输出或者输入;数据寄存器用来向引脚输出数据或者从引脚读入数据。所以我们要先查看一下 PH15 的配置寄存器。例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2NhaW5pYW9zaGFuZ3hpYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">
我们发现 PH15 控制寄存器一共同拥有3位28-30。共同拥有 8 种工作模式,因为要控制 led 的状态,我们将它设置为输出模式。所以 PH15 控制寄存器的内容应该为 001。那么这个寄存器在哪个位置呢。在表上有 Offset:0x100 我们知道,PH寄存器的偏移地址是 0x100。可是基地址是多少呢。
再往前面查阅就会发现
所以基地址就是 0x01C20800。基地址和偏移地址都有了。我们就能够定位 PH_CFG1 寄存器的地址就是(0x01C20800+0x100),我们仅仅须要将这个寄存器的第28-30位置为:
- 30 29 28
- 0 0 1
就能够了。
当控制寄存器配置完毕之后,我们就须要向数据寄存器写入数据来控制 led 的闪烁。我们相同查看芯片手冊:
能够看到,PH的数据寄存器用每一位来表示一个引脚的状态。我们要控制 PH15 引脚。就须要对这个寄存器的第15位进行操作。
所以,接下来就是。開始动手向驱动框架中加入对硬件操作的时候:
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/cdev.h>
- #include <linux/device.h>
- #include <asm/io.h>
- #include <asm/uaccess.h>
- //驱动名
- #define DEV_NAME "led"
- //从设备的个数
- #define DEV_COUNT 1
- //定义与硬件相关的宏
- //基地址
- #define BASE_ADDRESS 0x01C20800
- //PH_CFG1寄存器的地址
- #define PH_CFG1 (BASE_ADDRESS+0x100)
- //PH_DAT寄存器的地址
- #define PH_DAT (BASE_ADDRESS+0x10C)
- //三个回调函数,当在应用程序运行对应的操作时
- //驱动程序会调用对应的函数来进行处理
- ssize_t led_write(struct file *, const char __user *, size_t, loff_t *);
- int led_open(struct inode *, struct file *);
- int led_release(struct inode *, struct file *);
- //声明设备号
- static dev_t dev_number;
- //设备在内存中表示的结构体
- static struct cdev* cdevp;
- //注冊文件操作的回调函数的结构体
- static struct file_operations fops =
- {
- .owner = THIS_MODULE,
- //注冊对应的回调函数
- .open = led_open,
- .release = led_release,
- .write = led_write,
- };
- //用来创建设备文件的class
- static struct class* classp;
- //声明用来表示PH_CFG1内存地址的变量
- volatile static unsigned long* __ph_cfg1;
- //用来表示PH_DAT内存地址的变量
- volatile static unsigned long* __ph_dat;
- //初始化
- static int __init led_init(void)
- {
- //错误标记
- int err;
- printk("led init\n");
- //申请设备号
- err = alloc_chrdev_region(&dev_number,0,DEV_COUNT,DEV_NAME);
- if(err)
- {
- printk("alloc device number fail\n");
- return err;
- }
- //假设申请成功,打印主设备号
- printk("major number : %d\n",MAJOR(dev_number));
- //给cdev结构体在内存中分配空间
- cdevp = cdev_alloc();
- //假设分配失败
- if( cdevp==NULL )
- {
- printk("cdev alloc failure\n");
- //注销前面申请的设备号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return -1;
- }
- //将cdev结构体与
- //注冊文件操作的回调函数的结构体file_operations关联起来
- cdev_init(cdevp,&fops);
- //将cdev结构体和申请的设备号关联起来
- err = cdev_add(cdevp,dev_number,DEV_COUNT);
- if(err)
- {
- printk("cdev add failure\n");
- //释放申请的cdev空间
- cdev_del(cdevp);
- //注销申请的设备编号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return err;
- }
- //给class分配空间
- classp = class_create(THIS_MODULE,DEV_NAME);
- if( classp==NULL )
- {
- printk("class create failure\n");
- //释放申请的cdev空间
- cdev_del(cdevp);
- //注销申请的设备编号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- return -1;
- }
- //创建设备文件
- device_create(classp,NULL,dev_number,"%s",DEV_NAME);
- printk("/dev/%s create success\n",DEV_NAME);
- return 0;
- }
- static void __exit led_exit(void)
- {
- printk("led exit\n");
- //释放分配的class空间
- if( classp )
- {
- device_destroy(classp,dev_number);
- class_destroy(classp);
- }
- //释放分配的cdev空间
- if( cdevp )
- {
- cdev_del(cdevp);
- }
- //注销申请的设备号
- unregister_chrdev_region(dev_number,DEV_COUNT);
- }
- module_init( led_init );
- module_exit( led_exit );
- //当在应用程序中运行 open 函数时,
- //会调用以下的这个函数
- int led_open(struct inode* pinode,struct file* pfile)
- {
- //暂时变量
- unsigned long tmp;
- printk("led open\n");
- //将PH15管脚设置为输出状态
- //将PH_CFG1这个硬件寄存器的地址,映射到linux内存,并获取映射后的地址
- //通过对这个地址的操作。就能够控制PH_CFG1
- __ph_cfg1 = (volatile unsigned long*)ioremap(PH_CFG1,4);
- //将设置PH15寄存器
- tmp = *__ph_cfg1;
- tmp &= ~(0xf<<28);
- tmp |= (1<<28);
- *__ph_cfg1 = tmp;
- //将灯初始化为熄灭的状态
- __ph_dat = (volatile unsigned long*)ioremap(PH_DAT,4);
- tmp = *__ph_dat;
- tmp |= (1<<15);
- *__ph_dat = tmp;
- return 0;
- }
- //当在应用程序中运行 close 函数时,
- //会调用以下的函数
- int led_release(struct inode* pinode,struct file* pfile)
- {
- printk("led release\n");
- //注销分配的内存地址
- iounmap(__ph_dat);
- iounmap(__ph_cfg1);
- return 0;
- }
- //当在应用程序中调用 write 函数时。
- //会调用以下的这个函数
- ssize_t led_write(struct file* pfile,const char __user* buf,size_t count,loff_t* l)
- {
- int val;
- volatile unsigned long tmp;
- printk("led write\n");
- //从用户空间读取数据
- copy_from_user(&val,buf,count);
- printk("write %d\n",val);
- //从应用程序读取命令
- //来控制led灯
- tmp = *__ph_dat;
- if( val==1 )
- {
- //灯亮
- tmp &= ~(1<<15);
- }
- else
- {
- //灯灭
- tmp |= (1<<15);
- }
- *__ph_dat = tmp;
- return 0;
- }
- MODULE_LICENSE("GPL");
上面的是完整的控制pcduino上led闪烁的驱动程序,写完这个驱动程序之后,再写一个以下的測试程序就能够使 led 闪烁了,測试的代码例如以下:
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- int main(void)
- {
- int fd;
- int val = 1;
- //打开驱动相应的设备文件
- fd = open("/dev/led",O_RDWR);
- if( fd<0 )
- {
- printf("open /dev/led error\n");
- return -1;
- }
- while(1)
- {
- //写入高电平
- write(fd,&val,sizeof(int));
- //睡眠一秒
- sleep(1);
- //将电平反转
- val = 0;
- //写入低电平
- write(fd,&val,sizeof(int));
- //睡眠一秒
- sleep(1);
- val = 1;
- }
- close(fd);
- return 0;
- }
使用 gcc testled.c 将该应用程序编译,如果生成a.out,安装新版的驱动程序后,使用
- sudo ./a.out
就能够看到 pcduino 上的 led 就開始闪烁了。
超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”的更多相关文章
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...
- 物联网操作系统HelloX已成功移植到MinnowBoard MAX开发板上
在HelloX开发团队的努力下,以及Winzent Tech公司(总部在瑞典斯德哥尔摩)的支持下,HelloX最新版本V1.78已成功移植到MinnowBoard MAX开发板上.相关源代码已经发布到 ...
- 织女星开发板使用RISC-V核驱动GPIO
前言 织女星开发板是OPEN-ISA社区为中国大陆地区定制的一款体积小.功耗超低和功能丰富的 RISC-V评估开发板,基于NXP半导体四核异构RV32M1主控芯片. 两个RISC-V核:RI5CY + ...
- 使用Xilinx SDSoc在Xilinx zcu102开发板上编程HelloWorld
关于Xilinx SDSoc的介绍我就不再复述了,我理解的也不一定准确,可以阅读官方文档了解SDSoc,你可以把它理解为一个集成开发环境 (IDE),通过SDSoc我们能够简单快速的对Xilinx的开 ...
- 如何编译(helloworld)可以在开发板上运行的应用
本节介绍如何编译可以在开发板上运行的应用,编译方法很简单.基于:iTOP4412开发板首先要确定一下环境变量,如下图所示,使用“cd”命令回到根目录,然后使用命令“vim .bashrc”打开环境变量 ...
- RP4412开发板烧写Ubuntu12.04失败原因分析解决
Ubuntu烧写失败可能是卡的问题 问:用RP4412开发板,卡烧了光盘中的fastboot失败,现在如何补救呢? 答:INAND格式化,利用usb来升级啊. 也有文档,看升级文档. 问:这个是怎么回 ...
- 荣品RP4412开发板烧写内核cannot load出错的原因
问:荣品RP4412开发板烧写必须要配置Xmanager吗? 现在我烧写内核出现这个错误是什么原因呢? 答:4412文件夹下没有zImage这个文件, 你打开4412这个文件夹. 你都拼写错了, zI ...
- 荣品RP4412开发板烧写Ubuntu系统应注意SD卡内存大些
问:RP4412开发板用SD卡烧写光盘中的fastboot失败,现在如何补救呢? 答:INAND格式化, 利用usb来升级啊, 也有文档,看升级文档. 问: 这个是怎么回事? 答:你是升级什么系统? ...
- easycwmp在开发板上的配置
原创作品,转载请注明出处 copyright:weishusheng 2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...
随机推荐
- CentOS6.7安装部署LNMP(nginx1.8.0+php5.6.10+mysql5.6.12)
IP-10.0.0.8 1.安装nginx mkdir -p /server/tools cd /server/tools yum install -y pcre pcre-devel openssl ...
- HDOJ 5360 Hiking 优先队列+贪心
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意: 大概的意思就是每个人有个人数接受范围$[l_i,r_i]$,现在你每次能从还未被选取的人 ...
- about乘法逆元
本博客部分摘自 hwim 定义 乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元.b ≡ a-1 (mod p),a ...
- 从源码解析 Spring JDBC 异常抽象
初入学习 JDBC 操作数据库,想必大家都写过下面的代码: 数据库为:H2 如果需要处理特定 SQL 异常,比如 SQL 语句错误,这个时候我们应该怎么办? 查看 SQLException 源码,我们 ...
- 利用注解和反射,将Bean枚举字段的值填入相应的字段中,并转化为fastjson返回前台
需求:需要将枚举类型的字段例如enable(是否启用)转化为enable:1,enableName:是.这种形式返回给前台. 思路:在bean字段上加上枚举类型的注解,通过字段的值和枚举类反射获取枚举 ...
- 编译lua
http://www.lua.org/ 新建一个 static library 工程,把解压得到的目录下的src子目录中的所有.h和.c文件拷贝到新工程目录下. 工程中删除自动生成的 main.c 文 ...
- GOF 23种设计摩搜-建造者模式
• 场景: – 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样 一个问题需要处理: • 装配这些子组件是不是有个步骤问题? – 实际开发中,我们所需要的对象构建时 ...
- SolidEdge 工程图中如何给零件添加纹理或贴图
格式-检视-勾选纹理 选中一个零件之后,点击格式-面,在纹理选项卡中找到纹理的贴图 最后效果如下图所示,如果不勾选检视纹理,则虽然的确贴图了,但是不显示出来给你看.如果贴图文件没了,也不会显示 ...
- PPAPI插件的动态创建、改动、删除
一旦你完毕了PPAPI插件的开发,实际使用时可能会有下列需求: 动态创建PPAPI插件 删除PPAPI插件 改变PPAPI插件的尺寸 实现起来非常easy,从JS里直接訪问DOM(BOM)就可以.以下 ...
- vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页
设置代理,避免出现跨域问题 /*设置代理,避免出现跨域问题*/ proxyTable: { '/api':{ target: 'https://www.oschina.net/action/apiv2 ...