在上一篇文章中学习了linux字符驱动的开发,需要使用应用程序对完成的驱动进行验证,现在开始学习应用程序的开发。

一、准备材料

开发环境:VMware

操作系统:ubuntu

开发版:湃兔i2S-6UB

二、man手册使用

学过编程语言的小伙伴都知道在使用一些函数的时候需要导入相应的库文件,而函数属于哪个图文件都会也相应的API说明文档,而linux开发也不例外。在linux系统中提供了man手册,比如我需要查询printf()这个函数所在的头文件是那个,只需要linux下使用man 3 printf命令即可查看,如下图所示



当你不知道使用的函数需要应用什么头文件时即可通过man手册进行查询,具体教程可以参考Linux Man手册的使用示例

三、main参数

在学习c语言的时候,使用的main的函数都是int main(void),而在linux却多了两个变量,原型如下所示

int main(int argc, char *argv[]) {
return 0;
}

argc:应用程序参数个数

argv[]:具体的参数内容,字符串形式

如果在linux下这样./helloApp 1执行程序时,那么程序中argc = 1 、 argv[0] = 1。可以通过这样的形式将执行用户需要的变量传入函数中。

四、程序编写

linux对调用驱动程序时都是通过文件的形式进行操作的,所谓的linux下一切皆文件,需要用到以下函数

int open(const char *pathname, int flags)
int close(int fd)
ssize_t write (int fd, const void * buf, size_t count)
ssize_t read(int fd, void * buf, size_t count)

需要了解函数相应是使用方法,可以通过man手册进行查询,准备工作完成后就可以开始应用程序的编写了。

源码hello2.c文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h> /*
*argc:应用程序参数个数
*argv[]:具体的参数内容,字符串形式
*./hello2App <filename> <1:2> 1表示读,2表示写
*./hello2App /dev/hello2 1 表示从驱动里面读数据
*./hello2App /dev/hello2 2 表示向驱动里面写数据
* */ int main(int argc, char *argv[])
{
int ret = 0;
int fd = 0;
char *filename;
char readbuf[100], writebuf[100];
static char usrdata[] = {"hell0 This is user data!"}; if(argc !=3) {
printf("Instruction usage error!!!\r\n");
printf("./helle2App <filename> <1:2> 1表示读,2表示写\r\n");
printf("./hello2App ./dev/hello2 1 \r\n");
return -1;
} filename = argv[1]; fd = open(filename, O_RDWR);
if(fd < 0) { } if(atoi(argv[2]) ==1){
ret = read(fd, readbuf, 50);
if(ret <0) {
printf("read file %s failed!\r\n", filename);
} else {
printf("App read data:%s\r\n", readbuf);
}
} if(atoi(argv[2]) == 2) {
memcpy(writebuf, usrdata, sizeof(usrdata));
ret = write(fd,writebuf, 50);
if(ret <0) {
printf("write file %s failed\r\n", filename);
} else { }
} ret =close(fd);
if(ret <0) {
printf("close file %s falied!\r\n", filename);
} return 0;
}

代码编写完成后使用交叉编译器编译,编译完成后将驱动和应用程序都拷贝至arm开发板的/lib/modules/4.1.43+目录下

arm-linux-gnueabihf-gcc hello2App.c -o hello2App
sudo cp hello2App hello2_demo2.ko /home/rootfs/lib/modules/4.1.43+ -f

五、测试

启动开发板,进入/lib/modules/4.1.43+目录,然后加载之前编写的驱动

modprobe hello_demo2
lsmod
cat /proc/devices



创建属性节点

mknod /dev/helle2 c 248 0
ls /dev

创建成功后/dev目录下回生成一个hello2的文件,然后运行应用程序对驱动进行测试

./hello2App /dev/hello2 1
./hello2App /dev/hello2 2



看到如图信息说明我们编写的应用程序和驱动都是成功的,测试完成后卸载驱动即可。

rmmod hello_demo2

参考文献

Linux Man手册的使用示例:https://www.cnblogs.com/shanyu20/p/10943393.html

linux open函数详解:https://blog.csdn.net/renlonggg/article/details/80701949

深入理解linux下write()和read()函数:https://blog.csdn.net/boiled_water123/article/details/81951351

正点原子视屏教程:https://www.bilibili.com/video/BV1fJ411i7PB?p=6

linux应用程序开发入门的更多相关文章

  1. linux应用程序开发-文件编程-系统调用方式

    在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...

  2. 嵌入式Linux应用程序开发详解------(创建守护进程)

    嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...

  3. 微信小程序开发入门教程

    做任何程序开发要首先找到其官方文档,微信小程序目前还在邀请内测阶段,目前官方放出了部分开发文档,经过笔者一天的查看和尝试,感觉文档并不全面,但是通过这些文档已经能够看出其大概面貌了.闲话不多说,我们先 ...

  4. scala程序开发入门

    scala程序开发入门,快速步入scala的门槛: 1.Scala的特性: A.纯粹面向对象(没有基本类型,只有对象类型).Scala的安装与JDK相同,只需要解压之后配置环境变量即可:B.Scala ...

  5. 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程

    前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...

  6. 微信小程序开发入门(一)

     小程序学习入门--(一) 最近自己学习微信小程序的过程当中自己总结出来的知识点,我会不断地更新和完善! 小程序的开发工具 一台电脑 熟悉HTML.CSS.JS基本语法 开发工具: 微信web开发者工 ...

  7. 微信小程序开发入门与实践

    基础知识---- MINA 框架 为方便微信小程序开发,微信为小程序提供了 MINA 框架,这套框架集成了大量的原生组件以及 API.通过这套框架,我们可以方便快捷的完成相关的小程序开发工作. MIN ...

  8. 微信小程序-开发入门

    微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值 ...

  9. 微信小程序开发入门篇

    本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果. 开发准备工作 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的& ...

  10. 微信小程序开发入门:10分钟从0开始写一个hello-world

    小程序开发需要三个描述整体程序的app文件 和 一个描述多个页面的 pages文件夹. (1)三个app文件分别是app.js,app.json,app.wxss. app.js文件是脚本文件处理一些 ...

随机推荐

  1. FPGA之PLD的简单设计

    FPGA之PLD的简单设计 1.实验原理 PLD是可编程逻辑器件的简称,是FPGA的前身(FPGA是在PLD的基础上发展出来的).从PLD设计可以感受早期可编程逻辑器件的特点,了解FPGA在器件层的原 ...

  2. KingbaseES V8R6集群运维案例--主库PITR恢复后备库无法连接到集群

    案例说明: KingbaseES V8R6集群,在主库执行PITR恢复后,clone备库:但是启动集群后,备库无法连接到主库,流复制状态和集群节点状态异常. 适用版本: KingbaseES V8R6 ...

  3. KingbaseES V8R6 集群运维案例 -- 集群断电重新加电后恢复

    ​ 官方文档介绍: https://help.kingbase.com.cn/v8/highly/availability/cluster-use/cluster-use-2.html#id35 全局 ...

  4. 跳转到制定Sheet页及提交指定sheet页内容

    一.跳转到指定Sheet的实现 话不多说,先上效果图 两个按钮的事件分别如下: _g().loadSheetByName("sheet1") # 跳转至sheet1按钮事件 _g( ...

  5. LiftPool:双向池化操作,细节拉满,再也不怕丢特征了 | ICLR 2021

    论文参考信号处理中提升方案提出双向池化操作LiftPool,不仅下采样时能保留尽可能多的细节,上采样时也能恢复更多的细节.从实验结果来看,LiftPool对图像分类能的准确率和鲁棒性都有不错的提升,而 ...

  6. #提交答案题#LOJ 6467 'Zip' Quine

    题目 一种比较巧妙的方式 print 1 print 1 print 1 print 1 print 1 print 1 repeat 3 2 print 2 repeat 3 2 print 2 r ...

  7. 狂神说Java——Mybatis学习笔记

    前言:配合狂神老师的教学视频使用效果更佳: https://www.bilibili.com/video/BV1NE411Q7Nx/?spm_id_from=333.1007.top_right_ba ...

  8. 高并发报错too many clients already或无法创建线程

    高并发报错 too many clients already 或无法创建线程 本文出处:https://www.modb.pro/db/432236 问题现象 高并发执行 SQL,报错"so ...

  9. HarmonyOS数据管理与应用数据持久化(一)

      一. 数据管理概述 功能介绍 数据管理为开发者提供数据存储.数据管理能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全.可靠等管理机制. ● 数据存储:提供通用数据持久化能力,根据数据特 ...

  10. HDC.Together2023 HarmonyOS学生公开课议程抢先看!

     未来已来,见证相遇 万众瞩目的HarmonyOS学生公开课 于8月6日9:30正式起航 关注HarmonyOS生态前景 聚焦HarmonyOS新技术 畅谈HarmonyOS未来 把握时代发展机遇,让 ...