在开发嵌入式系统时,您会考虑"最差实践"?
我对不该做的一些想法是:
我确信那里有很多好的想法,不该做什么,让我们听听他们!
什么时候应该使用轮询方法什么时候应该使用基于中断的方法?是否存在可以使用两者的情况?
在为各种项目编写了几种不同的自定义串行协议之后,我开始对每次重新发明轮子感到沮丧.我不断继续为每个项目开发定制解决方案,而是一直在寻找更通用的解决方案.我想知道是否有人知道满足以下要求的串行协议(或更好的实现):
速度不是太大的问题,我们愿意放弃一些速度,以满足其他一些需求.但是,我们希望尽量减少所需资源的数量.
我即将开始实施带有搭载ACK的滑动窗口协议,而且没有选择性重复,但是想到也许有人可以省去我的麻烦.有谁知道我可以利用的现有项目?或者也许是更好的策略?
更新
我认真考虑过TCP/IP实现,但我真的希望能有更轻量级的东西.TCP/IP的许多功能对于我正在尝试的内容来说都是过度的.我愿意(不情愿地)接受我想要的功能可能不包含在较轻的协议中.
更新2
感谢您关于CAN的提示.我过去看过它,将来可能会用它.我真的很喜欢这个库来处理确认,缓冲,重试等.我想我更需要网络/传输层而不是数据链路/物理层.
更新3
所以听起来这个领域的最新技术是:
如果您遇到这个问题,请随时发布更多答案.
在嵌入式C应用程序中,我有一个大图像,我想旋转90度.目前我使用众所周知的简单算法来做到这一点.但是,这个算法要求我制作另一个图像副本.我想避免为副本分配内存,我宁愿在原地旋转它.由于图像不是方形,这很棘手.有谁知道合适的算法?
编辑添加澄清,因为人们问:
我以通常的格式存储图像:
// Images are 16 bpp
struct Image {
int width;
int height;
uint16_t * data;
};
uint16_t getPixel(Image *img, int x, int y)
{
return img->data[y * img->width + x];
}
Run Code Online (Sandbox Code Playgroud)
我希望移动data数组的内容,然后交换width和height成员变量.因此,如果我从9x20像素图像开始,然后旋转它,我将最终得到一个20x9像素的图像.这改变了图像的步幅,这使算法复杂化很多.
我正在为嵌入式系统编写启动代码 - 在跳转到main()函数之前加载初始堆栈指针的代码 - 我需要告诉它我的应用程序将使用多少字节的堆栈(或更大的,保守估计).
我被告知gcc编译器现在有一个-fstack-usage选项和-fcallgraph-info选项,它可以以某种方式用于静态计算我的"最大堆栈使用率".(" Botcazou,Comar和Hainque的编译时堆栈需求分析与GCC").
奈杰尔琼斯说,递归在嵌入式系统中是一个非常糟糕的主意("计算你的堆栈大小"2009),所以我一直小心不要在这段代码中做任何相互递归的函数.
另外,我确保我的中断处理程序都没有重新启用中断,直到它们最终从中断返回指令,所以我不需要担心重入中断处理程序.
如果没有递归或重入中断处理程序,则应该可以静态地确定最大堆栈使用情况.(所以大多数答案如何确定最大堆栈使用量?不适用).我的理解是我(或者最好是我的PC上的一些代码在每次重建可执行文件时自动运行)首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断中断时,最大值当main()函数没有被中断时,它的堆栈深度.然后我将它们全部添加到找到总(最坏情况)最大堆栈深度.当main()后台任务在被最低优先级中断中断时处于最大深度时发生(在我的嵌入式系统中),并且当中断被下一个最低优先级中断时,该中断处于其最大深度中断,等等.
我正在使用YAGARTO和gcc 4.6.0来编译LM3S1968 ARM Cortex-M3的代码.
那么如何使用-fstack-usage选项和-fcallgraph-info选项与gcc一起计算最大堆栈深度?或者是否有更好的方法来确定最大堆栈使用量?
(有关针对Keil编译器的几乎相同问题,请参阅如何确定嵌入式系统中的最大堆栈使用情况?)
我需要在比特流中扫描16位字.不保证在字节或字边界上对齐.
实现这一目标的最快方法是什么?有各种蛮力方法; 使用表和/或移位,但是有没有"bit twiddling shortcuts"可以通过给出yes/no /也可以包含每个字节或单词到达时的标志结果来减少计算次数?
C代码,内在函数,x86机器代码都很有趣.
我一直被内核黑客和嵌入式系统所吸引.
开始乱搞这些东西有没有人有很好的教程(+容易获得的硬件)?
像写作驱动程序等工具包,有很好的文档,价格合理吗?
谢谢!
我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序.唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际.
我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的形式)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码.
有没有办法用Raspberry Pi实现这一目标?这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等).