linux
为什么学习嵌入式开发要学习linux?
一、为什么学习嵌入式开发要学习linux?
因为现在稍微复杂的产品都会跑linux操作系统,然后需要在linux下开发应用程序
二、嵌入式linux?
BSP(Board Support Package),板级支持包,也称为硬件抽象层HAL或者中间层。
它将系统上层软件和底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP层提供的接口开发即可。
BSP是相对于操作系统而言的,不同的操作系统有不同定义形式的BSP,要求BSP所实现的功能也有所不同。
在嵌入式Linux系统中,主要是初始化底层硬件并引导操作系统;同时,BSP又是和硬件相关的,还要考虑对硬件的初始化操作。这些初始化操作主要是对CPU、内存、中断等相关的寄存器及协处理器进行正确的配置。
在不同的开发阶段,因为核心和文件系统所处的位置不同,BSP所要完成的工 作也有所不同;在开发调试阶段,BSP要能够与主机通信并从主机下载核心;在目标产品中,BSP要能够从非易失存储设备中加载核心。
扩展资料
BSP有两个特点:硬件相关性和操作系统相关性。
设计一个完整的BSP需要完成两部分工作:
A、 嵌入式系统的硬件初始化和BSP功能。
片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态。
板级初始化:包含软硬件两部分在内的初始化过程,为随后的系统初始化和应用程序建立硬件和软件的运行环境。
系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。
B、 设计硬件相关的设备驱动。
三、如何学习Linux?
你好,学习Linux可以按照以下步骤进行:
1. 了解Linux的基本概念和历史:了解Linux是一个开源的操作系统,它的发展历程和特点。
2. 下载和安装Linux发行版:选择一个适合自己的Linux发行版,如Ubuntu、Fedora等,下载并安装到自己的计算机上。
3. 学习Linux的基本命令:学习Linux的命令行界面,掌握一些基本的命令,如文件操作、目录操作、用户管理等。
4. 了解Linux的文件系统:学习Linux的文件系统结构和文件权限,掌握如何在Linux中管理文件和目录。
5. 学习Shell编程:Shell是Linux的命令行解释器,学习Shell编程可以帮助你自动化一些操作,提高工作效率。
6. 掌握Linux的网络管理:学习Linux的网络配置和管理,包括网络连接、IP地址配置、路由配置等。
7. 学习Linux的软件包管理:学习如何使用包管理器安装和管理软件包,如apt、yum等。
8. 参与开源项目:加入开源社区,参与开源项目,与其他Linux爱好者交流和分享经验。
9. 阅读相关书籍和教程:可以阅读一些关于Linux的书籍和在线教程,了解更多关于Linux的知识。
10. 实践和实验:通过实践和实验,将所学知识运用到实际中,加深对Linux的理解和掌握。
总之,学习Linux需要有持续的学习和实践,通过不断地探索和实践,你可以逐渐掌握Linux的技能。
四、linux嵌入式开发环境用什么linux?
学习嵌入式开发,一般会面临3个阶段:
1:学习基本的编程语言C/C++,此时linux版本不重要,重要的是符合C99标准的编译器,建议使用ubuntu或者centos,免费并且都默认安装了标准g++编译器。
2:学习linux的基本环境,包括libc库等基本C库和一些标准的内核函数,建议使用ubuntu,不要使用centos,centos里面扩展了不少redhat的库,在实际嵌入式开发无法使用。
3:学习嵌入式的特定编译环境,交叉编译技巧等等,此时必须在实际的嵌入式开发板上学习,不能在发行版linux下学习,因为嵌入式开发板都是用裁剪和优化过的linux内核,编译环境也是嵌入式处理器自带的,和发行版linux有较大的不同。 总的来说,学习嵌入式开发,建议使用ubuntu
五、linux和嵌入式linux内核上有何不同?
linux指操作系统,拥有许多完整的功能,所以整个操作系统需要占据一定的存储空间,而嵌入式linux内核一般是对linux进行裁剪后重新编译产生的一个精简版的linux操作系统,去除了一些不需要的功能,使系统需要的存储空间更小,方便移植到芯片的存储空间中去
六、初学者如何学习开发嵌入式Linux/Android设备的驱动?
书接上文,上文提到在获取内核device中可以参考本PWM实现。
PWM设备也是内核中一个标准的 平台设备,我们使用PWM来实现风扇控,本章在介绍pwm设备之前我们先介绍一下内核设备树中的aliases节点。
顾名思义,aliases 重命名,内核设备树提供给我们的driver设备驱动一个统一的管理方式,可以将我们的设备驱动全部挂载在aliases链表中,本人不才,未领会到其中的高深用法,我觉得这个aliases 设备节点最常见的用法就是 get id。
比较核心的两个函数如下:
extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
extern int of_alias_get_id(struct device_node *np, const char *stem);
一个是扫描全部的aliases节点,另一个是通过device_node和名称,获取aliases节点后面的序号。
具体代码有兴趣的朋友可以看:drivers/of/base.c中该函数的实现。
我们本次使用pwm,为什么要先介绍 aliases节点呢?
在驱动开发过程,阅读pwm内核源码,我们发现,pwm的控制接口pwm_apply_state所需要的句柄为:pwm_device,那么我们的核心目的是不是就是如何获取 pwm_device,如果我们拿到了 pwm_device,那么也就掌握了 内核中的pwm外设。
内核中获取 pwm_device的标准接口为:
struct pwm_device *pwm_request(int pwm_id, const char *label)
所需要的参数也很简单,一个id号,和一个 label, label就是设备名称。
能解决问题吗?当然可以,使用这个接口可以直接从内核中拿到pwm_device,但是这个id有一个问题,就是这个id会随着我们使能的pwm数量而改变。加入我们chip上目前又12路pwm,我们使能 8, 9, 10 三路,那么此时内核中会生成三个pwm节点,他们的编号是 0 ,1,2,对应的就是8, 9,10。
这样就会存在问题,我们传进去的id号,可能非我们真正使用的id,当有一天我又使能了pwm8,那么所有的号都需要依次加一,非常不人性化。
但是内核设备树中,所声明的pwm号,在驱动中request时却是真正的pwm号,那么这块是 怎么绑定且转换的呢?
可以发现,内核中使用的接口是,在dts中表示后,内核中使用的接口是:
static inline struct pwm_device *devm_of_pwm_get(struct device *dev,
struct device_node *np,
const char *con_id)
{
return ERR_PTR(-ENODEV);
}
通过查看源码可以发现,在dts中进行设备注册后会动态与device绑定在一起。
那么我们思路就来了,返回去找,根据id找到 device_node,再根据device_node 就可以在pwm中找到pwm_chip了,然后顺手取一下里面的id(内核中的id),再使用标准的pwm_request接口申请就好了。
代码如下:
typedef void* pwm_handle;
pwm_handle pwm_init(int pwm_channal, const char *label)
{
int ret = 0;
pwm_handle handle;
int kernel_idex;
struct pwm_device* pwm = NULL;
struct device_node* node = NULL;
/* 根据通道号在内核中查找当前注册的 device_node */
node = of_alias_get_device_node(pwm_channal, "pwm"); /* todo:不添加到内核 平台相关层添加一个 .h */
if (node == NULL) {
printk("%s Faild not get alias device node, Please check dts have pwm for alias\n");
return NULL;
}
/* 根据查找到根据查找到的device node 从pwm全局中查找注册的pwm_chip */
struct pwm_chip *node_pwm_chip = of_node_to_pwmchip(node); /* 使用 pwm->pwm 重新request一次 */
if (node_pwm_chip == NULL) {
printk("%s Faild not get pwm_chip, Please check enable pwm from dts\n");
return NULL;
}
/* 利用上步骤查找到的 pwm_chip 拿到可以使用的 pwm_device */
pwm = node_pwm_chip->pwms;
/* 通过pwm_device 中的 pwm参数,可以拿到当前device在kernel中的通道号 */
kernel_idex = pwm->pwm;
pwm = pwm_request(kernel_idex, label);
if (IS_ERR(pwm)) {
ret = PTR_ERR(pwm);
if (ret != -EPROBE_DEFER)
printk("Could not get PWM: %d\n", ret);
return NULL;
}
handle = pwm;
return handle;
}
有些同学看到代码就要问了,内核中没又这个接口啊?of_alias_get_device_node
没错,上面手的aliases节点,中并没有这个接口,我们可以模仿获取id的方法来获取device_node嘛
代码如下:
struct device_node *of_alias_get_device_node(int id, const char *stem)
{
struct alias_prop *app;
struct device_node *node;
mutex_lock(&of_mutex);
list_for_each_entry(app, &aliases_lookup, link) {
if (strcmp(app->stem, stem) != 0)
continue;
if (id == app->id) {
node = app->np;
break;
}
}
mutex_unlock(&of_mutex);
return node;
}
至此,我们就得到了 我们梦寐以求的 pwm_device.
直接上控制接口:
typedef struct
{
int pwm_id; //pwm通道号
int period; //pwm周期
int duty; //pwm占空比
int polity; //pwm极性
int enable; //使能状态
void *prsv; //保留
uint32_t rsv; //保留
}pwm_cfg;
int pwm_ctrl(pwm_handle handle, pwm_cfg* state)
{
int ret = 0;
struct pwm_device *pwm;
struct pwm_state ofstate;
if (handle == NULL) {
printk("%s: input handle is NULL\n", __FUNCTION__);
ret = -ENOMEM;
}
pwm = (struct pwm_device*)handle;
ofstate.duty_cycle = state->duty;
ofstate.period = state->period;
ofstate.polarity = state->polity;
if(state->enable)
ofstate.enabled = true;
else
ofstate.enabled = false;
ret = pwm_apply_state(pwm, &ofstate);
return ret;
}
七、学习SQL和Linux?
同意楼上的,如果需要深入的学习,还是去培训一下。如果打算自学,建议安装一个流行版本的linux发行版,我建议是ubuntu。我不知道你要学的SQL是指什么,但不管你是sql server或是mysql,甚至是oracle,也一样是先安装一个数据库系统,给自己一个实际任务去摸索一下比较好。
八、学习linux推荐图书?
1. 《Linux程序设计(第4版)》(经典入门书)
2. 《跟阿铭学Linux》(畅销新书)
3. 深入理解程序设计:使用Linux汇编语言(畅销新书)
4. 《深入Linux内核架构》(经典书)
5. 《Linux shell脚本编程入门》(新书)、
6. 《Linux命令行与shell脚本编程大全(第2版)》(经典书)
7. 《Linux Shell脚本攻略(第2版)》(新书)
8. 《Linux就是这个范儿》(畅销新书)
9. 《ARM Linux内核源码剖析》(畅销新书)
10. 《Linux系统架构和应用技巧》(新书)
11. 《只是为了好玩:Linux之父林纳斯自传》(畅销经典) 下载链接
九、新手如何学习Linux?
谈谈如何学习Linux
1、假如你从来接触过Linux的话,首先要做的就找一本指导书来学习
2、现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面
鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇
3、“鸟哥的私房菜”讲的很全面,可能会包括一些已经过时的知识点,但是这本书是入门Linux必备
4、学习Linux的时候,或者学习其他网络知识的时候最重要的就是实践操作
所以学习Linux,实践操作是必不可少的
5、首先就是要装一个Linux系统,鸟哥开始几章会讲Linux的由来以及怎样安装Linux的系统
6、安装Linu系统来学习使用Vmware 虚拟机就行了,不用真机装,没必要
7、按照鸟哥私房菜书籍的步骤一步一步照着做,刚开始学习最好让自己的学习环境跟书里的一致,这样可以少很多麻烦,也不至于打击你的学习兴趣
8、装完系统之后就是学习操作了,并且照着书里的操作一步步实践
当然很多时候你会不明白,这个时候你可以百度一下,很多人说goole,但goole已经XXX百度完全解决你初学时时候遇到的问题
9、再然后就是进入某些Linux社区去看看,提问题,或者看看别人所遇到的问题,新手吗?可以去新手频道看看
我推荐的网站是红联社区的新手园地
10、 你看书的时候刚开始是通读,然后是泛读,最后是精读,总之一定要读多几遍
11、等你第一次把书通读一遍之后,可以选择一些视频来看
推荐是韩顺平的Linux 或者上51cto的Linux 频道,里面有很多好的视频,有些要收费,有些不用
一些初级基础视频一般是不收费的,而且讲的也挺好
Linux视频我推荐51cto的马哥Linux,很不错,很受欢迎
12、上面的这些只是入门,如果想继续深入就要选择一个老师专门系统的学习当然不是说找个老师,而是在网上找到一个教程讲解不错的老师,并且有高中低级系统的知识体系
一步步跟着学,这样就差不多了
13、Linux是一个系统,一个平台,平常工作中应用的是工作在这个平台的软件,鸟哥第二部服务器篇就会讲解这些,第二部服务器篇就没那么容易看明白
14、这个时候就可以选择用百度查找官方文档,或是一些高手的经验博文
不断查找问题,解决问题
15、学习Linux的时候不要想一口气把所有全部学完,基础一定要打好
16、基础篇和服务器篇学的差不多的时候,找工作就行了
17、找到工作之后一定要继续学习,因为Linux最注重的是实际工作中的经验
18、要是你进入一个比较好的公司,各种平台环境都有,这个时候你要做的就是静下心来学习,汲取养分,这样以后往更高级走才有本钱!
19、总之刚开始你把鸟哥两部学完就可以找工作了,至于往后的发展就是要你自己努力学习了,然后在通过公司中那些几十万百万设备的环境,丰富自己的知识!
20、Linux 的工资高低,就是你遇到的问题越多,解决的越快,你的工资就高了
十、linux学习书籍推荐?
1. 《Linux程序设计(第4版)》(经典入门书)2. 《跟阿铭学Linux》(畅销新书)3. 深入理解程序设计:使用Linux汇编语言(畅销新书)4. 《深入Linux内核架构》(经典书)5. 《Linux shell脚本编程入门》(新书)、6. 《Linux命令行与shell脚本编程大全(第2版)》(经典书)7. 《Linux Shell脚本攻略(第2版)》(新书)8. 《Linux就是这个范儿》(畅销新书)9. 《ARM Linux内核源码剖析》(畅销新书)10. 《Linux系统架构和应用技巧》(新书)11. 《只是为了好玩:Linux之父林纳斯自传》(畅销经典)
下载链接
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...