c++11在编写Arduino时如何使用?我可以使用Arduino IDE或其他环境.我最感兴趣的是核心语言改进,而不是需要标准库更改的东西.
我正在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_firmware和firmware_helper查看$FIRMWARE …
在为各种项目编写了几种不同的自定义串行协议之后,我开始对每次重新发明轮子感到沮丧.我不断继续为每个项目开发定制解决方案,而是一直在寻找更通用的解决方案.我想知道是否有人知道满足以下要求的串行协议(或更好的实现):
速度不是太大的问题,我们愿意放弃一些速度,以满足其他一些需求.但是,我们希望尽量减少所需资源的数量.
我即将开始实施带有搭载ACK的滑动窗口协议,而且没有选择性重复,但是想到也许有人可以省去我的麻烦.有谁知道我可以利用的现有项目?或者也许是更好的策略?
更新
我认真考虑过TCP/IP实现,但我真的希望能有更轻量级的东西.TCP/IP的许多功能对于我正在尝试的内容来说都是过度的.我愿意(不情愿地)接受我想要的功能可能不包含在较轻的协议中.
更新2
感谢您关于CAN的提示.我过去看过它,将来可能会用它.我真的很喜欢这个库来处理确认,缓冲,重试等.我想我更需要网络/传输层而不是数据链路/物理层.
更新3
所以听起来这个领域的最新技术是:
如果您遇到这个问题,请随时发布更多答案.
有没有人对以下任何嵌入式TCP/IP堆栈有特别好(或坏)的经验?
我的需求是一个坚固,易于端口的堆栈.代码大小并不十分重要,性能相对重要,但易用性和移植非常重要.
系统可能会使用尚未确定的RTOS,但根据我的经验,大多数堆栈可以在有或没有RTOS的情况下使用.该平台很可能是ARM变体(很可能是ARM7或CM3).
不太关心将堆栈连接到以太网驱动程序,因此这不是选择中的重中之重.
我对从Linux,RTEMS等操作系统中提取堆栈并不十分感兴趣.
我也对Interniche,Micrium等商业产品不感兴趣......
堆栈不需要各种各样的铃声和口哨,不需要IPv6,我不需要任何东西(Web服务器,FTP服务器等).事实上,我可能会只使用UDP,虽然我可以设想一些优先使用TCP的方案.
我错过的其他筹码经验当然也非常有趣.
感谢您的时间和意见.
首先是我的问题的背景,具体细节如下:
我在平台上工作的公司目前是使用MPLAB IDE作为开发环境的Microchip PIC32系列.此前,我们还为同一应用编写了Microchip dsPIC和TI MSP系列的固件.固件非常简单,因为代码分为三个主要模块:设备控制,数据采样和用户通信(通常是用户PC).器件控制是通过GPIO总线和至少一部分需要SPI或I2C控制的部分组合实现的.使用定时器模块中断数据采样以保持采样频率,使用更多SPI/I2C和GPIO总线来控制采样硬件(即ADC).用户通信目前通过USB使用Microchip App Framework实现.
那么现在的问题是:鉴于我上面所描述的内容,我会考虑在什么时候为我的项目使用RTOS?目前我正在考虑将这些可能的触发点作为使用RTOS的理由:
您认为我应该考虑哪些其他方面?根据您的经验,您认为(或强迫)您考虑使用RTOS而不是仅仅在基本运行时运行代码?关于为RTOS设计/编程的其他资源的指针也非常受欢迎.
从我对固件工程工具,实践等历史的了解来看,它一直落后于软件工程领域几年.例如,据我所知,在固件世界中,关于C++是否真的值得用于我们的应用程序仍然存在相当多的争论,并且一些C++编译器明显缺失(微芯片?!?).我想在很大程度上这是由于固件和软件之间的要求不同.再次,从历史来看,在经过适当审查的工具和技术进入固件世界之前,似乎只是时间问题.
现代软件工程师经常使用哪些方法,工具,最佳实践等,固件工程师是否也可以利用它们来改进他们的工艺?
具体来说,我正在考虑以下几个轴(但不要让它们限制你):
我也很乐意看到嵌入式商店回答或评论答案,以提供有关理论可行性或更好的个人经验的反馈.
更新
我特别感兴趣的是稍微跳过曲线.所以相对较新的东西已经过相当好的审查(适用于大多数人),比如C++,TDD等等.你一直在使用什么,喜欢什么?
更新2
到目前为止,我在答案中获得了很多优秀的通用编程建议,这很好,但我真的在寻找更多非传统方法,这些方法已经证明对人们来说是成功的.我正在试图挑逗敏捷实践者,TDDers以及那些尝试过东西的人,看到它在黑桃中得到回报或者失败可怕.作为一名软件工程师,您在过去几年中采用了哪种工具或实践产生了非常积极或消极的影响?
我有兴趣深入了解我的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) 在打印机,交换机等嵌入式设备中,我很困惑固件和操作系统之间的区别.嵌入式设备操作系统是否与PC(Linux和Windows)类似?
例如,我有一台打印机,它有一个嵌入式Web服务器,允许我远程管理打印机.当我打开制造商网站时,我发现操作系统是:OS 9.86.这是什么类型的操作系统?请参阅:Phaser 8560支持和驱动程序
embedded operating-system firmware embedded-linux web-operating-system
firmware ×10
embedded ×6
arduino ×2
c ×2
c++ ×2
rtos ×2
assembly ×1
compression ×1
ide ×1
linux-kernel ×1
networking ×1
protocols ×1
serial-port ×1
tcp ×1
unpack ×1