标签: firmware

如何使用c ++ 11编写Arduino?

c++11在编写Arduino时如何使用?我可以使用Arduino IDE或其他环境.我最感兴趣的是核心语言改进,而不是需要标准库更改的东西.

c++ ide arduino firmware

53
推荐指数
3
解决办法
3万
查看次数

Linux内核如何知道在哪里查找驱动程序固件?

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

/lib/modules/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)

及其固件:

/lib/firmware/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)

当我根据" 备用构建方法:老式Debian方式 " 编译2.6.24-24通用Ubuntu内核时,我得到了相应的模块目录,除了需要固件的设备外,我的所有设备都工作,例如我的英特尔无线网卡(ipw2200)模块).

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

ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
Run Code Online (Sandbox Code Playgroud)

errno-base.h将此定义为:

#define ENOENT       2  /* No such file or directory */
Run Code Online (Sandbox Code Playgroud)

(返回ENOENT的函数在它前面放一个减号.)

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

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

更新

我找到了解决我遇到的确切问题的解决方案,但是它不再有效,因为Ubuntu已经淘汰/etc/hotplug.d并且不再存储其固件/usr/lib/hotplug/firmware.

UPDATE2

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

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

加载固件的实际请求是由驱动程序(在我的情况下为ipw2200)通过系统调用完成的:

request_firmware(..., "ipw2200-bss.fw", ...);
Run Code Online (Sandbox Code Playgroud)

现在,在驱动程序调用request_firmwarefirmware_helper查看$FIRMWARE …

firmware linux-device-driver linux-kernel

51
推荐指数
2
解决办法
7万
查看次数

嵌入式设备的良好串行通信协议/堆栈?

在为各种项目编写了几种不同的自定义串行协议之后,我开始对每次重新发明轮子感到沮丧.我不断继续为每个项目开发定制解决方案,而是一直在寻找更通用的解决方案.我想知道是否有人知道满足以下要求的串行协议(或更好的实现):

  • 支持多种设备.我们希望能够支持RS485总线.
  • 保证交货.某种确认机制,以及一些简单的错误检测(CRC16可能很好).
  • 不是主/从.理想情况下,从设备可以异步发送数据.这主要是出于审美原因,轮询每个奴隶的概念对我来说感觉不对.
  • OS独立性.理想情况下,它根本不依赖于抢占式多任务环境.如果我能得到其他东西,我愿意承认这一点.
  • ANSI C.我们需要能够为几种不同的体系结构编译它.

速度不是太大的问题,我们愿意放弃一些速度,以满足其他一些需求.但是,我们希望尽量减少所需资源的数量.

我即将开始实施带有搭载ACK的滑动窗口协议,而且没有选择性重复,但是想到也许有人可以省去我的麻烦.有谁知道我可以利用的现有项目?或者也许是更好的策略?

更新
我认真考虑过TCP/IP实现,但我真的希望能有更轻量级的东西.TCP/IP的许多功能对于我正在尝试的内容来说都是过度的.我愿意(不情愿地)接受我想要的功能可能不包含在较轻的协议中.

更新2
感谢您关于CAN的提示.我过去看过它,将来可能会用它.我真的很喜欢这个库来处理确认,缓冲,重试等.我想我更需要网络/传输层而不是数据链路/物理层.

更新3
所以听起来这个领域的最新技术是:

  • 精简的TCP/IP堆栈.可能从lwIPuIP开始.
  • 基于CAN的实现,它可能很大程度上依赖于CAN总线,因此在其他物理层上没有用处.像CAN Festival这样的东西可以帮助你.
  • HDLC或SDLC实现(如此).这可能就是我们要走的路线.

如果您遇到这个问题,请随时发布更多答案.

c embedded serial-port protocols firmware

38
推荐指数
3
解决办法
1万
查看次数

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

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

我的需求是一个坚固,易于端口的堆栈.代码大小并不十分重要,性能相对重要,但易用性和移植非常重要.

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

不太关心将堆栈连接到以太网驱动程序,因此这不是选择中的重中之重.

我对从Linux,RTEMS等操作系统中提取堆栈并不十分感兴趣.

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

堆栈不需要各种各样的铃声和口哨,不需要IPv6,我不需要任何东西(Web服务器,FTP服务器等).事实上,我可能会只使用UDP,虽然我可以设想一些优先使用TCP的方案.

我错过的其他筹码经验当然也非常有趣.

感谢您的时间和意见.

embedded networking tcp rtos firmware

33
推荐指数
3
解决办法
2万
查看次数

为什么我会考虑将RTOS用于我的嵌入式项目?

首先是我的问题的背景,具体细节如下:

我在平台上工作的公司目前是使用MPLAB IDE作为开发环境的Microchip PIC32系列.此前,我们还为同一应用编写了Microchip dsPIC和TI MSP系列的固件.固件非常简单,因为代码分为三个主要模块:设备控制,数据采样和用户通信(通常是用户PC).器件控制是通过GPIO总线和至少一部分需要SPI或I2C控制的部分组合实现的.使用定时器模块中断数据采样以保持采样频率,使用更多SPI/I2C和GPIO总线来控制采样硬件(即ADC).用户通信目前通过USB使用Microchip App Framework实现.


那么现在的问题是:鉴于我上面所描述的内容,我会考虑在什么时候为我的项目使用RTOS?目前我正在考虑将这些可能的触发点作为使用RTOS的理由:

  • 代码复杂性? 代码库架构/组织仍然足够小,我可以保留所有细节.
  • 多任务/多线程? 通过中断对模块执行进行时间分片就足以实现多任务处理.
  • 测试? 目前,我们没有通过硬件烟雾测试进行太多正式测试或验证(我希望在不久的将来能够纠正).
  • 通讯? 我们目前使用自定义数据包格式和协议,该协议几乎只执行START,STOP,SEND DATA命令,数据是二进制blob.
  • 项目范围? 在不久的将来,我们有可能获得一个项目,将我们的设备集成到一个更大的系统中,目标是将该系统用于大规模生产.目前我们所有的项目都是实验原型,快速周转约一个月,一次生产一个或两个单位.

您认为我应该考虑哪些其他方面?根据您的经验,您认为(或强迫)您考虑使用RTOS而不是仅仅在基本运行时运行代码?关于为RTOS设计/编程的其他资源的指针也非常受欢迎.

embedded rtos firmware

29
推荐指数
2
解决办法
2万
查看次数

固件工程师可以向软件工程师学习什么?

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

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

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

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

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

更新
我特别感兴趣的是稍微跳过曲线.所以相对较新的东西已经过相当好的审查(适用于大多数人),比如C++,TDD等等.你一直在使用什么,喜欢什么?

更新2
到目前为止,我在答案中获得了很多优秀的通用编程建议,这很好,但我真的在寻找更多非传统方法,这些方法已经证明对人们来说是成功的.我正在试图挑逗敏捷实践者,TDDers以及那些尝试过东西的人,看到它在黑桃中得到回报或者失败可怕.作为一名软件工程师,您在过去几年中采用了哪种工具或实践产生了非常积极或消极的影响?

embedded firmware

24
推荐指数
4
解决办法
7168
查看次数

分析未知格式的打包文件,如何继续?

我有兴趣深入了解我的Behringer X32调音台的固件,所以我从(http://www.behringerdownload.de/X32/X32_Firmware_2.10.zip)下载了实际文件并启动了IDA pro.内部包含的.update文件以某种时间戳开头,下面的字符串几乎看起来像一个目录列表,我假设那些文件以某种方式连接到固件更新文件中.例如,有字符串

seg000:00005480: logo/X32RACK.bmp
Run Code Online (Sandbox Code Playgroud)

但由于没有类似位图的结构,我认为这是压缩数据.我怎么能从这里继续?有没有办法解释各种打包和/或连接的文件格式猜测和尝试/错误的格式.

或者 - 甚至更好 - 有人知道使用这种结构的包装工吗?

64    bytes c-string
24    bytes zero, probably reserved
DWORD with some index, increasing thru the file but not always +1
DWORD of files Size
32    bytes additional data
Run Code Online (Sandbox Code Playgroud)

到目前为止我发现了什么:

00000000  db '"2.10 23db64e4672e (Thu, 20 Nov 2014 14:50:29 +0100) (clean)"',0,0,0; UpdateID
00000000  dd 6 dup(0)  ; reserved
00000000  dd 181   ; NumberOfContainedFiles
00000000  dd 12380    ; SomeUnknownValue
00000000  dd 44B026A4h, 0BA3708DBh, 4DD38F6Eh, 0F7C30159h, 31D6B225h; Data
00000000  dd …
Run Code Online (Sandbox Code Playgroud)

compression reverse-engineering unpack firmware

20
推荐指数
1
解决办法
692
查看次数

编写固件:汇编还是高级?

相关:

如果您正在为微控制器编写代码,那么如果您使用汇编语言或C语言或其他高级语言编写,会有真正的区别吗?如果你编写C代码,你会如何编译它?

谢谢

c embedded assembly firmware

19
推荐指数
6
解决办法
3万
查看次数

Arduino C++代码:您可以使用虚函数和异常吗?

编写固件:汇编或高级别的问题开始对此评论进行跟进:

在为Arduino平台编译C++代码时,您可以使用虚函数,异常等吗?或者你想(必须)使用C++的一个子集(如评论所述)?

在为Arduino平台编程时还有其他注意事项吗?

c++ virtual-functions arduino firmware

15
推荐指数
2
解决办法
1万
查看次数

固件和操作系统有什么区别?

在打印机,交换机等嵌入式设备中,我很困惑固件和操作系统之间的区别.嵌入式设备操作系统是否与PC(Linux和Windows)类似?

例如,我有一台打印机,它有一个嵌入式Web服务器,允许我远程管理打印机.当我打开制造商网站时,我发现操作系统是:OS 9.86.这是什么类型的操作系统?请参阅:Phaser 8560支持和驱动程序

embedded operating-system firmware embedded-linux web-operating-system

15
推荐指数
3
解决办法
3万
查看次数