问题标签 [firmware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
937 浏览

mobile - 中国移动软件开发?

根据我的假设(),那里有数亿部中国手机(或品牌手机的克隆)。这些手机的固件和操作系统似乎是相同的。这些电话仅在设计上有所不同,并且可能是硬件。

我想知道这些手机是否有任何开发工具包或软件开发支持。这些手机中的操作系统和/或固件是什么?这些是开源的还是在线可用的?这些手机支持java吗?从哪里可以在线获取有关这些手机及其软件的更多信息?

提前非常感谢。

0 投票
2 回答
1196 浏览

git - 需要新项目的 git repo 布局建议

我正在开发一个计划保存在 git 存储库中的新项目。我知道如何在 CVS 中执行此操作,但我对 git 有点陌生,可以使用一些建议。

该项目是两个嵌入式设备的固件,它们相互通信并被打包成一对。对于这两种设备,都有代码的生产变体和制造变体。这两个设备项目都有许多子/兄弟项目,用于执行硬件的各个位(闪烁 LED 等)或与硬件相关的代码位(驱动程序等)。大多数代码在所有事物中都是通用的。

我还要求能够独立地修改生产和制造固件,以防止对一个固件的更改通过验证将另一个发回。

下面是我现有的目录布局。在我知道我会使用 git 之前,它就有机地成长了,而且大部分时间都被放下了。如果有更好的方法,我不反对重新组织整个事情。

  • 项目根
    • 包括
    • 源代码
    • 设备A
      • 生产
      • 制造业
      • 纽扣
      • ...
    • 设备B
      • 生产
      • 制造业
      • 纽扣
      • ...

我很想将生产和制造放在分支上,但我通常在给定的一天同时工作,而 git 一次只允许一个分支处于活动状态。然后我不知道如何处理闪烁、按钮等,因为它们并不是真正的制造或生产。建议?

说明:

  • 代码的制造版本在生产线上用于测试硬件。产品代码在硬件通过测试站后加载,然后交付给客户。两者至少有 75% 相似,但它们需要独立,这样我就可以修复生产代码中的错误,而无需停止生产线。

  • 因为 DeviceA 和 DeviceB 是一对,所以两个代码集都被标记并同时发布,具有相同的发布版本号。

0 投票
4 回答
75915 浏览

linux-kernel - Linux 内核如何知道在哪里寻找驱动程序固件?

我正在 Ubuntu 下编译一个自定义内核,我遇到了我的内核似乎不知道在哪里寻找固件的问题。在 Ubuntu 8.04 下,固件与内核版本的绑定方式与驱动程序模块的绑定方式相同。例如,内核 2.6.24-24-generic 将其内核模块存储在:

及其固件:

当我根据“ Alternate Build Method: The Old-Fashioned Debian Way ”编译 2.6.24-24-generic Ubuntu 内核时,我得到了适当的模块目录,我的所有设备都可以工作,除了那些需要固件的设备,比如我的英特尔无线网卡(ipw2200模块)。

例如,内核日志显示,当 ipw2200 尝试加载固件时,控制固件加载的内核子系统无法找到它:

errno-base.h 将其定义为:

(返回 ENOENT 的函数在它前面加上一个减号。)

我尝试在 /lib/firmware 中创建一个符号链接,其中我的内核名称指向 2.6.24-24-generic 目录,但是这导致了同样的错误。该固件是非 GPL,由 Intel 提供并由 Ubuntu 打包。我不相信它与特定的内核版本有任何实际联系。cmp表明各个目录中的版本是相同的。

那么内核如何知道去哪里寻找固件呢?

更新

我找到了解决我遇到的确切问题的方法,但是它不再适用,因为 Ubuntu 已经消除/etc/hotplug.d并且不再将其固件存储在/usr/lib/hotplug/firmware.

更新2

更多的研究发现了更多的答案。在 92 版之前udev,该程序firmware_helper是加载固件的方式。从udev93 开始,这个程序被一个名为 firmware.sh 的脚本取代,据我所知,它提供了相同的功能。这两个都将固件路径硬编码为/lib/firmware. Ubuntu 似乎仍在使用/lib/udev/firmware_helper二进制文件。

固件文件的名称firmware_helper在环境变量$FIRMWARE中传递给连接到路径/lib/firmware并用于加载固件的环境变量。

加载固件的实际请求是由驱动程序(在我的例子中为 ipw2200)通过系统调用发出的:

现在在驱动程序调用request_firmwarefirmware_helper查看$FIRMWARE环境变量之间的某个地方,内核包名称被添加到固件名称之前。

那么谁在做呢?

0 投票
1 回答
930 浏览

file - 更改固件内的文件需要新的校验和

我有一个要更改的相框的固件文件。此更改的目的是使设备在启动期间显示自定义图像。

我已经设法用我自己的自定义文件切换现有的 JPEG 文件,但是无法用这个新的固件文件刷新设备。设备抱怨校验和无效,这似乎是正确的,因为我没有重新计算它。

有关如何继续进行此操作的任何提示?我试过在文件中查找校验和,但到目前为止我还没有成功。

一个 zip 文件中的原始未更改和自定义更改固件

0 投票
6 回答
16215 浏览

c - A good serial communications protocol/stack for embedded devices?

After writing several different custom serial protocols for various projects, I've started to become frustrated with re-inventing the wheel every time. In lieu of continuing to develop custom solutions for every project, I've been searching for a more general solution. I was wondering if anyone knows of a serial protocol (or better yet, implementation) that meets the following requirements:

  • Support multiple devices. We'd like to be able to support an RS485 bus.
  • Guaranteed delivery. Some sort of acknowledgement mechanism, and some simple error detection (CRC16 is probably fine).
  • Not master/slave. Ideally the slave(s) would be able to send data asynchronously. This is mostly just for aesthetic reasons, the concept of polling each slave doesn't feel right to me.
  • OS independence. Ideally it wouldn't rely on a preemptive multitasking environment at all. I'm willing to concede this if I can get the other stuff.
  • ANSI C. We need to be able to compile it for several different architectures.

Speed isn't too much of an issue, we're willing to give up some speed in order to meet some of those other needs. We would, however, like to minimize the amount of required resources.

I'm about to start implementing a sliding window protocol with piggybacked ACKs and without selective repeat, but thought that perhaps someone could save me the trouble. Does anyone know of an existing project that I could leverage? Or perhaps a better strategy?

UPDATE
I have seriously considered a TCP/IP implementation, but was really hoping for something more lightweight. Many of the features of TCP/IP are overkill for what I'm trying to do. I'm willing to accept (begrudgingly) that perhaps the features I want just aren't included in lighter protocols.

UPDATE 2
Thanks for the tips on CAN. I have looked at it in the past and will probably use it in the future. I'd really like the library to handle the acknowledgements, buffering, retries etc, though. I guess I'm more looking for a network/transport layer instead of a datalink/physical layer.

UPDATE 3
So it sounds like the state of the art in this area is:

  • A trimmed down TCP/IP stack. Probably starting with something like lwIP or uIP.
  • A CAN based implementation, it would probably rely heavily on the CAN bus, so it wouldn't be useful on other physical layers. Something like CAN Festival could help along the way.
  • An HDLC or SDLC implementation (like this one). This is probably the route we'll take.

Please feel free to post more answers if you come across this question.

0 投票
8 回答
26211 浏览

networking - 使用(免费)嵌入式 TCP/IP 堆栈的经验?

是否有人对以下任何嵌入式 TCP/IP 堆栈有特别好的(或坏的)经验?

我需要一个可靠的、易于移植的堆栈。代码大小不是很重要,性能相对重要,但易用性和移植性非常重要。

该系统可能会使用一个尚未确定的 RTOS,但根据我的经验,大多数堆栈都可以在有或没有 RTOS 的情况下使用。该平台很可能是 ARM 变体(很可能是 ARM7 或 CM3)。

不太关心将堆栈栓接到以太网驱动程序,因此这不是选择的重点。

我对从操作系统(例如 Linux、RTEMS 等)中提取堆栈不是很感兴趣。

我也对 Interniche、Micrium 等商业产品不感兴趣......

堆栈不需要各种花里胡哨,不需要 IPv6,而且我不需要任何东西(Web 服务器、FTP 服务器等)。事实上,我可能会只使用 UDP,尽管我可以设想 TCP 更可取的几个场景。

我错过的其他堆栈的经验当然也非常有趣。

感谢您的时间和投入。

0 投票
9 回答
7802 浏览

embedded - 固件工程师可以从软件工程师那里学到什么?

从我对固件工程工具、实践等历史的了解来看,它一直落后于软件工程领域好几年。例如,据我所知,固件世界仍然存在相当多的争论,即 C++ 是否真的值得用于我们的应用程序,并且一些 C++ 编译器明显不存在(微芯片?!?)。我想这在很大程度上是由于固件和软件之间的要求不同。同样,从历史来看,经过适当审查的工具和技术进入固件世界似乎只是时间问题。

现代软件工程师经常使用哪些方法、工具、最佳实践等,固件工程师还可以利用哪些方法来改进他们的工艺?

具体来说,我正在考虑以下轴(但不要让它们限制你):

  • 提高代码清洁度/可维护性
  • 减少缺陷引入并改进检测
  • 改进文档
  • 需求管理
  • 提高可重用性

我也很想看到嵌入式商店回答或评论答案,以提供有关理论可行性的反馈,或者更好的是个人经验。

更新
我对稍微领先一点特别感兴趣。所以相对较新的东西经过了相当好的审查(对大多数人来说效果很好),比如 C++、TDD 等。你一直在使用什么并且喜欢什么?

更新 2
到目前为止,我在答案中得到了很多很好的通用编程建议,这很好,但我真的在寻找更多已经证明对人们成功的非传统方法。我试图梳理一下敏捷实践者、TDDers 以及其他尝试过东西并看到它获得回报或惨败的人。作为一名软件工程师,您在过去几年中采用的工具或实践是否产生了显着的积极或消极影响?

0 投票
4 回答
1778 浏览

synchronization - 两个任务之间的同步

这实际上是嵌入式系统中固件的设计问题,我有两个独立执行的 ISR(具有相同优先级)。这些 ISR 在硬件生成数据时触发。我想要一个必须在task1和task2之间同步的机制。任务 2 必须知道在任务 1 中计算的某些值,然后在计算任务 2 中的某些值时必须考虑这些值。我没有要使用的操作系统原语,即系统没有任何操作系统。Task1 在 ISR1 的上下文中执行,task2 在 ISR2 的上下文中执行。我们使用的处理器是 STMicroelectronics 32 控制器

编辑:附加信息处理器连接到某些 IP,当它们准备好数据时触发中断。这些 IP 充当输入流帧数据的累加器类型。

0 投票
1 回答
10590 浏览

language-agnostic - 固件开发入门

我是一名软件开发人员。最近我正在考虑尝试一些固件开发,因为我工作的公司正试图进入该领域。我有很多关于固件开发的问题 - 比如:

  1. 使用了哪些工具——比如 IDE?
  2. 大部分代码是用哪种语言编写的?
  3. 如何将代码移植到微控制器中?
  4. 如何为不同的微控制器编码?
  5. 如何确定构建特定应用程序所需的东西(选择微控制器等)?

还有什么我应该知道的,我从哪里开始?对不起,如果这个问题太基本了,但我在其他地方找不到任何令人满意的答案。

0 投票
3 回答
1836 浏览

history - 固件一词从何而来?

我听说固件这个术语来自它介于硬件软件之间。我还听说它指的是来自构建硬件的公司(公司)的软件。

该术语何时首次使用,该术语的起源是什么?