linux
我想学嵌入式LINUX驱动开发,很纠结到底选ARM9?
一、我想学嵌入式LINUX驱动开发,很纠结到底选ARM9?
对于初学者来说,C语言最关键,接着是微机原理,数据结构,再有是arm体系结构,推荐还是armV4,虽然说很老,但网上资料多,学习方便,当把V4搞熟,在学习其他的很容易。
不推荐M系列,那些是工控用的比较多,操做系统简单,不利于初学者学习
当然如果零基础,最好在Linux下,对于初学者来说还是比较难,但Linux可以直接在电脑上仿真,因为arm好大一部分用的Linux操作系统,两者内核一样,利于初学者
二、如何基于X86开发板构建嵌入式LINUX系统?
不怎么样,首先你要有一个模拟器或开发板用于运行构建好的二进位映像,然后你得有相关的知识,例如知道怎么构建工具链,如何在工具链上构建和裁减内核,如何构建基本工具包等等,这是一个复杂的系统工作,需要用一本厚厚的书来介绍。除此以外,你还得有很强的动手能力和百折不挠的学习态度,努力学习吧,骚年。
三、嵌入式Linux系统开发模式?
嵌入式系统通常为一个资源受限的系统。
直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。目前,一般采用的办法是,先在通用计算机上编写程序,然后,通过交叉编译,生成目标平台上可运行的二进制代码格式,最后下载到目标平台上的特定位置上运行,下面就由福州卓跃教育做具体步骤介绍。 第一步,建立嵌入式Linux应用开发环境。目前,常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链,目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。第二步,交叉编译和链接。在完成嵌入式软件的编码之后,就是进行编译和链接,以生成可执行代码。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器,这就要求在建立好的交叉开发环境中进行交叉编译和链接。第三步,交叉调试。①硬件调试。如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。目前,Motorola公司提供的开发板上使用的是DBM调试端口,而ARM公司提供的开发板上使用的则是JTAG调试端口。使用合适的软件工具与这些调试端口进行连接,可以获得与ICE类似的调试效果。②软件调试。在嵌入式Linux应用开发系统中,Linux系统内核调试,可以先在Linux内核中设置一个调试桩(debug stub),用作调试过程中和宿主机之间的通信服务器。然后,可以在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目标机上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;
}
五、嵌入式Linux驱动开发有什么推荐的公司吗?应届生?
感谢邀请。汇总了一份2023最全的嵌入式公司,建议收藏起来,以后投递的时候作为参考!
2023年最新国产半导体芯片行业细分企业名录: 囊括MCU、存储芯片、模拟芯片、电源IC、功率器件、IGBT、MOSFET、CMOS、液晶芯片、触控芯片、指纹识别芯片、时钟芯片、载波芯片、数字隔离器等领域。
01 移动CPU
02 计算机CPU/MPU
03 IP
04 GPU
05 ASIC
06 DSP
07 FPGA
08 EDA
09 MCU
10 存储芯片
11 模拟芯片
12 电源IC
13 功率器件
14 IGBT
15 MOSFET
16 CMOS
17 液晶芯片
18 触控芯片
19 指纹识别芯片
20 人脸识别/虹膜
21 射频芯片
22 WiFi芯片
23 蓝牙芯片
24 NB-loT芯片
25 RFID芯片
26 5G芯片
27 光芯片
28 光模块
29 GPS/北斗芯片
30 USB转接芯片
31 视频转换芯片
32 网络交换芯片
33 音频芯片
34 激光核心元件
35 激光雷达
36 毫米波雷达
37 MMIC
38 TPMS模组
39 LED芯片
40 时钟芯片
41 载波芯片
42 数字隔离器
43 航空航天领域嵌入式SOC
44 安全芯片
45 智能卡芯片
46 AI芯片
47 智能应用处理器SOC
48 OTT盒子主控CPU
49 无人机主控芯片
50 智能消防机器人芯片
51 VR主控芯片
52 智能音箱芯片
53 蓝牙音箱芯片
54 智能电视芯片
55 商显主控
56 行车记录仪主控芯片
57 投影仪主控芯片
58 打印机芯片
59 视频监控芯片
60 高端电容电阻
61 连接器
62 晶振
63 传感器
64 芯片代理分销
65 半导体生产设备
66 硅晶圆
67 晶圆代工
68 半导体封测
69 测试设备
70 操作系统
原文链接:https://www.zhihu.com/question/576122754/answer/2829273341?utm_campaign=shareopn&utm_medium=social&utm_oi=805166261268004864&utm_psn=1595350880659845120&utm_source=wechat_session推荐一个 github仓库,上面放了上百本经典的嵌入式,计算机书籍,可以star一下,下次找书直接在上面搜索就可以了: github 书籍宝藏仓库 github访问不了可以访问这个:gitee 书籍宝藏仓库
练手项目推荐这篇文章:
分享GitHub上一些嵌入式相关的高星开源项目笔试面试推荐这个专栏:
嵌入式软件工程师笔试面试指南学习路线:
仲一:【干货分享】嵌入式学习路线公开!(书籍推荐+视频推荐+练手项目)嵌入式经典书籍,免费下载,值得收藏:
仲一:嵌入式Linux必读经典书籍(含下载方式)码字不易,如果觉得本篇文章对你有帮助,可以点个免费的赞支持作者 @仲一
六、初学者学嵌入式linux用arm9还是arm11开发板?
如果毕业后偏向手机、多媒体行业的话,建议ARM11,ARM11在处理这些方面有较大的优势。比如说IPHONE曾经用的就是ARM11作主控芯片,可见ARM11在多媒体方面的巨大优势。现在的安卓,用ARM11也可以运行,对于从事手机开发这方面来说,很有优势。
ARM9的话,比较成熟,网上教程也多,但是主频中等,对于需要大量处理数据的应用领域,还是比较吃力,另外,如果想做安卓开发的话,ARM9也不是很合适,还是因为主频的问题。如果想学LINUX系统开发,用ARM9可以。
总结一下,其实上选ARM9还是ARM11,要看你的目标是什么领域,然后根据你的目标,看一下什么处理器比较合适。
七、嵌入式开发时,Linux与开发板怎样连接?
这个应该只能在Linux下面安装eclipse,
然后安装cdt(建立c/c++工程用的)
最后建立一个eclipse工程然后修改编译熟悉把gcc改成arm-linux-gcc(或者其他)等交叉编译.就能编译了.如果要在线调试
需要在Linux下安装arm-gdb板子上安装一个放置一个gdbserver.就可以进行单步调试了.
八、嵌入式系统,驱动开发需要掌握什么知识?
嵌入式系统驱动开发需要掌握以下知识:
1. 嵌入式系统基本概念:了解嵌入式系统的定义、特点、应用领域和基本原理,为驱动开发打下基础。
2. 硬件知识:熟悉常见的嵌入式处理器(如 ARM、MIPS 等)及其架构、接口(如 LCD、触摸屏、存储器、串口等)和外围设备工作原理。
3. 嵌入式操作系统:了解嵌入式操作系统的原理和结构,如 Linux、RTOS 等,掌握其内核机制、进程管理、内存管理、中断处理等。
4. 驱动开发基本原理:学习驱动开发的基本概念、方法和技巧,如设备树、平台驱动、字符设备驱动、块设备驱动等。
5. 驱动编程技巧:掌握驱动程序的编写方法,包括初始化、操作、中断处理、电源管理等功能实现。
6. 设备驱动调试:学会使用调试工具(如示波器、逻辑分析仪等)对驱动程序进行调试和优化。
7. 嵌入式软件开发流程:了解嵌入式软件开发的基本流程,包括需求分析、设计、编码、调试、测试等。
8. Makefile 编写:学会编写简单的 Makefile,以便于管理和构建嵌入式系统。
9. 常用驱动开发框架:了解常见的驱动开发框架,如 Linux 内核、U-BOOT 等,掌握其使用方法和技巧。
10. 实践经验:通过实际项目开发,积累驱动开发的实践经验,提高驱动开发能力。
学习这些知识后,开发者将能够胜任嵌入式系统的驱动开发工作,设计并实现各种复杂程度的驱动程序。同时,不断跟进新技术和新标准,如物联网、大数据等领域,将有助于提升嵌入式驱动开发的专业素养。
九、如何通过USB实现PC与ARM开发板linux文件系统传输文件?
可以,可以使用USB转串口芯片,至于ARM端可以使用C编程接收
十、嵌入式Linux的底层驱动开发主要从事什么工作?
都说了是底层驱动开发了,那主要工作就是开发驱动了,比如板卡上的PCIE设备,IIC设备,SPI设备等等
热点信息
-
在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)下载和安装最新版本...