标签: embedded

嵌入式系统最差的做法

在开发嵌入式系统时,您会考虑"最差实践"?

我对不该做的一些想法是:

  • 避免抽象硬件层,而是在整个代码中扩展硬件访问.
  • 没有任何类型的仿真环境,只有exe/cute的实际硬件.
  • 避免单元测试,可能是由于以上两点
  • 不在分层结构中开发系统,因此较高层可能依赖于调试和工作的较低层功能
  • 选择硬件而不考虑将使用它的软件和工具
  • 使用专为简化调试而设计的硬件,例如无测试点,无调试LED,无JTAG等.

    我确信那里有很多好的想法,不该做什么,让我们听听他们!

  • embedded anti-patterns

    39
    推荐指数
    6
    解决办法
    3917
    查看次数

    基于轮询或中断的方法

    什么时候应该使用轮询方法什么时候应该使用基于中断的方法?是否存在可以使用两者的情况?

    embedded operating-system processor rtos interrupt

    39
    推荐指数
    4
    解决办法
    4万
    查看次数

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

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

    • 支持多种设备.我们希望能够支持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万
    查看次数

    将图像旋转90度的算法?(没有额外的记忆)

    在嵌入式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数组的内容,然后交换widthheight成员变量.因此,如果我从9x20像素图像开始,然后旋转它,我将最终得到一个20x9像素的图像.这改变了图像的步幅,这使算法复杂化很多.

    c embedded image-processing rotation

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

    如何用gcc确定嵌入式系统中的最大堆栈使用量?

    我正在为嵌入式系统编写启动代码 - 在跳转到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编译器的几乎相同问题,请参阅如何确定嵌入式系统中的最大堆栈使用情况?)

    embedded gcc code-analysis static-analysis

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

    C和嵌入式C有什么区别?

    任何人都可以告诉我他们之间的区别吗?

    c embedded

    37
    推荐指数
    4
    解决办法
    12万
    查看次数

    扫描位流中位模式的最快方法

    我需要在比特流中扫描16位字.不保证在字节或字边界上对齐.

    实现这一目标的最快方法是什么?有各种蛮力方法; 使用表和/或移位,但是有没有"bit twiddling shortcuts"可以通过给出yes/no /也可以包含每个字节或单词到达时的标志结果来减少计算次数?

    C代码,内在函数,x86机器代码都很有趣.

    c c++ embedded algorithm assembly

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

    在家学习内核黑客攻击和嵌入式开发?

    我一直被内核黑客和嵌入式系统所吸引.
    开始乱搞这些东西有没有人有很好的教程(+容易获得的硬件)?
    像写作驱动程序等工具包,有很好的文档,价格合理吗?

    谢谢!

    linux embedded kernel

    36
    推荐指数
    2
    解决办法
    7861
    查看次数

    AVR或PIC开始编程微控制器?

    我应该从哪个家庭开始学习?(从未对微控制器进行任何编程)

    embedded microcontroller

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

    如何在Raspberry Pi上运行没有操作系统的C程序?

    我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序.唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际.

    我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的形式)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码.

    有没有办法用Raspberry Pi实现这一目标?这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等).

    c embedded arm low-level raspberry-pi

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