2.线性回归与逻辑回归
2026/7/29 4:54:07
蚂蚁S9矿板引脚定义.csdn
蚂蚁S9矿板PS并发和竞争驱动 —目录.csdn
蚂蚁S9矿板PS并发和竞争驱动 —原子操作.csdn
蚂蚁S9矿板PS并发和竞争驱动 —自旋锁.csdn
蚂蚁S9矿板PS并发和竞争驱动 —信号量.csdn
蚂蚁S9矿板PS并发和竞争驱动 —互斥体.csdn
semaphore.c
#include<linux/types.h>#include<linux/kernel.h>#include<linux/delay.h>#include<linux/ide.h>#include<linux/init.h>#include<linux/module.h>#include<linux/errno.h>#include<linux/gpio.h>#include<asm/mach/map.h>#include<asm/uaccess.h>#include<asm/io.h>#include<linux/cdev.h>#include<linux/of.h>#include<linux/of_address.h>#include<linux/of_gpio.h>#include<linux/semaphore.h>#defineGPIOLED_CNT1/* 设备号个数 */#defineGPIOLED_NAME"gpioled"/* 名字 *//* dtsled设备结构体 */structgpioled_dev{dev_tdevid;/* 设备号 */structcdevcdev;/* cdev */structclass*class;/* 类 */structdevice*device;/* 设备 */intmajor;/* 主设备号 */intminor;/* 次设备号 */structdevice_node*nd;/* 设备节点 */intled_gpio;/* LED所使用的GPIO编号 */structsemaphoresem;/* 信号量 */};staticstructgpioled_devgpioled;/* led设备 *//* * @description : 打开设备 * @param – inode : 传递给驱动的inode * @param - filp : 设备文件,file结构体有个叫做private_data的成员变量 * 一般在open的时候将private_data指向设备结构体。 * @return : 0 成功;其他 失败 */staticintled_open(structinode*inode,structfile*filp){/* 获取信号量,如果获取不到则会进入休眠状态 */if(down_interruptible(&gpioled.sem))return-ERESTARTSYS;#if0down(&gpioled.sem);#endifreturn0;}/* * @description : 从设备读取数据 * @param - filp : 要打开的设备文件(文件描述符) * @param - buf : 返回给用户空间的数据缓冲区 * @param - cnt : 要读取的数据长度 * @param - offt : 相对于文件首地址的偏移 * @return : 读取的字节数,如果为负值,表示读取失败 */staticssize_tled_read(structfile*filp,char__user*buf,size_tcnt,loff_t*offt){return0;}/* * @description : 向设备写数据 * @param - filp : 设备文件,表示打开的文件描述符 * @param - buf : 要写给设备写入的数据 * @param - cnt : 要写入的数据长度 * @param - offt : 相对于文件首地址的偏移 * @return : 写入的字节数,如果为负值,表示写入失败 */staticssize_tled_write(structfile*filp,constchar__user*buf,size_tcnt,loff_t*offt){intret;charkern_buf[1];ret=copy_from_user(kern_buf,buf,cnt);// 得到应用层传递过来的数据if(0>ret){printk(KERN_ERR"kernel write failed!\r\n");return-EFAULT;}if(0==kern_buf[0])gpio_set_value(gpioled.led_gpio,0);// 如果传递过来的数据是0则关闭ledelseif(1==kern_buf[0])gpio_set_value(gpioled.led_gpio,1);// 如果传递过来的数据是1则点亮ledreturn0;}/* * @description : 关闭/释放设备 * @param – filp : 要关闭的设备文件(文件描述符) * @return : 0 成功;其他 失败 */staticintled_release(structinode*inode,structfile*filp){/* 释放信号量,信号量值加1 */up(&gpioled.sem);return0;}/* 设备操作函数 */staticstructfile_operationsgpioled_fops={.owner=THIS_MODULE,.open=led_open,.read=led_read,.write=led_write,.release=led_release,};staticint__initled_init(void){constchar*str;intret;/* 1.获取led设备节点 */gpioled.nd=of_find_node_by_path("/led");if(NULL==gpioled.nd){printk(KERN_ERR"gpioled: Failed to get /led node\n");return-EINVAL;}/* 2.读取status属性 */ret=of_property_read_string(gpioled.nd,"status",&str);if(!ret){if(strcmp(str,"okay"))return-EINVAL;}/* 2、获取compatible属性值并进行匹配 */ret=of_property_read_string(gpioled.nd,"compatible",&str);if(0>ret){printk(KERN_ERR"gpioled: Failed to get compatible property\n");returnret;}if(strcmp(str,"ming,led")){printk(KERN_ERR"gpioled: Compatible match failed\n");return-EINVAL;}printk(KERN_INFO"gpioled: device matching successful!\r\n");/* 4.获取设备树中的led-gpio属性,得到LED所使用的GPIO编号 */gpioled.led_gpio=of_get_named_gpio(gpioled.nd,"led-gpio",0);if(!gpio_is_valid(gpioled.led_gpio)){printk(KERN_ERR"gpioled: Failed to get led-gpio\n");return-EINVAL;}printk(KERN_INFO"gpioled: led-gpio num = %d\r\n",gpioled.led_gpio);/* 5.向gpio子系统申请使用GPIO */ret=gpio_request(gpioled.led_gpio,"LED-GPIO");if(ret){printk(KERN_ERR"gpioled: Failed to request led-gpio\n");returnret;}/* 6.将led gpio管脚设置为输出模式 */gpio_direction_output(gpioled.led_gpio,0);/* 7.初始化LED的默认状态 */ret=of_property_read_string(gpioled.nd,"default-state",&str);if(!ret){if(!strcmp(str,"on"))gpio_set_value(gpioled.led_gpio,1);elsegpio_set_value(gpioled.led_gpio,0);}elsegpio_set_value(gpioled.led_gpio,0);/* 8.注册字符设备驱动 *//* 创建设备号 */if(gpioled.major){gpioled.devid=MKDEV(gpioled.major,0);ret=register_chrdev_region(gpioled.devid,GPIOLED_CNT,GPIOLED_NAME);if(ret)gotoout1;}else{ret=alloc_chrdev_region(&gpioled.devid,0,GPIOLED_CNT,GPIOLED_NAME);if(ret)gotoout1;gpioled.major=MAJOR(gpioled.devid);gpioled.minor=MINOR(gpioled.devid);}printk("gpioled: major=%d,minor=%d\r\n",gpioled.major,gpioled.minor);/* 初始化cdev */gpioled.cdev.owner=THIS_MODULE;cdev_init(&gpioled.cdev,&gpioled_fops);/* 添加一个cdev */ret=cdev_add(&gpioled.cdev,gpioled.devid,GPIOLED_CNT);if(ret)gotoout2;/* 创建类 */gpioled.class=class_create(THIS_MODULE,GPIOLED_NAME);if(IS_ERR(gpioled.class)){ret=PTR_ERR(gpioled.class);gotoout3;}/* 创建设备 */gpioled.device=device_create(gpioled.class,NULL,gpioled.devid,NULL,GPIOLED_NAME);if(IS_ERR(gpioled.device)){ret=PTR_ERR(gpioled.device);gotoout4;}/* 初始化信号量 */sema_init(&gpioled.sem,1);return0;out4:class_destroy(gpioled.class);out3:cdev_del(&gpioled.cdev);out2:unregister_chrdev_region(gpioled.devid,GPIOLED_CNT);out1:gpio_free(gpioled.led_gpio);returnret;}staticvoid__exitled_exit(void){/* 注销设备 */device_destroy(gpioled.class,gpioled.devid);/* 注销类 */class_destroy(gpioled.class);/* 删除cdev */cdev_del(&gpioled.cdev);/* 注销设备号 */unregister_chrdev_region(gpioled.devid,GPIOLED_CNT);/* 释放GPIO */gpio_free(gpioled.led_gpio);}/* 驱动模块入口和出口函数注册 */module_init(led_init);module_exit(led_exit);MODULE_AUTHOR("DengTao <773904075@qq.com>");MODULE_DESCRIPTION("ming ZYNQ GPIO LED Driver");MODULE_LICENSE("GPL");#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h>#include<string.h>/* * @description : main主程序 * @param - argc : argv数组元素个数 * @param - argv : 具体参数 * @return : 0 成功;其他 失败 */intmain(intargc,char*argv[]){intfd,ret;intcnt=0;unsignedcharbuf[1];if(3!=argc){printf("Usage:\n""\t./semaphoreApp /dev/gpioled 1 @ close led\n""\t./semaphoreApp /dev/gpioled 0 @ open led\n");return-1;}/* 打开设备 */fd=open(argv[1],O_RDWR);if(0>fd){printf("ERROR: file %s open failed!\r\n",argv[1]);return-1;}/* 将字符串转换为int型数据 */buf[0]=atoi(argv[2]);/* 向驱动写入数据 */ret=write(fd,buf,sizeof(buf));if(0>ret){printf("ERROR: LED Control Failed!\r\n");close(fd);return-1;}/* 模拟占用25秒LED设备 */for(;;){sleep(5);cnt++;printf("App running times:%d\r\n",cnt);if(cnt>=5)break;}printf("App running finished!\n");/* 关闭设备 */close(fd);return0;}$CC-o semaphoreApp semaphoreApp.croot@ant:~# insmod semaphore.kogpioled: device matching successful!gpioled: led-gpio num=943gpioled:major=244,minor=0root@ant:~# chmod 777 semaphoreApproot@ant:~# ./semaphoreApp /dev/gpioled 0^C root@ant:~# ./semaphoreApp /dev/gpioled 1^C root@ant:~# ./semaphoreApp /dev/gpioled 1 &[1]520# ./semaphoreApp /dev/gpioled 1 执行1会自动关闭root@ant:~# ./semaphoreApp /dev/gpioled 0App running times:1 App running times:2 App running times:3 App running times:4 App running times:5 App running finished!