我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
如果我们volatile每次更新新值时
声明一个变量如果我们声明一个变量,const那么该变量的值将不会被更改
那么如上所述const volatile int temp;
声明变量temp有什么用?
如果我们宣布为什么会发生什么const int temp?
我的硬件C++和C89上有两个编译器
我正在考虑将C++与类一起使用但没有多态(以避免使用vtable).我想使用C++的主要原因是:
在开发非常有限的硬件(4kb RAM)时,您是否认为有理由坚持使用C89?
谢谢你的回答,他们真的很有帮助!
我认为这个主题通过,我会坚持使用C主要是因为:
因为你提供了很多好的答案,所以很难接受一个答案.不幸的是我不能创建一个wiki并接受它,所以我会选择一个让我最想的答案.
我正在寻找通用编程语言
到目前为止,下面是我的清单,我错过了什么?
我一直是一名嵌入式软件工程师,但通常在OSI堆栈的第3层或第2层.我不是一个硬件家伙.我一般都经常使用电信产品,通常是手机/手机,这通常意味着像ARM 7处理器.
现在我发现自己处于一个更通用的嵌入式世界中,在一个小型的初创公司中,我可能会转向"不那么强大"的处理器(这是主观位) - 我无法预测哪个.
我已经阅读了很多关于在嵌入式系统中使用C++在C++中的争论,而且没有明确的答案.有一些关于可移植性的小担忧,还有一些关于代码大小或运行时的问题,但我有两个主要问题:
1 - 异常处理; 我仍然不确定是否使用它(参见嵌入式C++:是否使用异常?)
2 - 我非常不喜欢嵌入式系统中的动态内存分配,因为它可能会引入问题.我通常有一个缓冲池,它在编译时静态分配,只提供固定大小的缓冲区(如果没有缓冲区,系统复位).当然,STL会进行大量的动态分配.
现在我必须决定是否使用或放弃STL - 对于整个公司,永远(它进入一些非常核心的s/w).
我跳哪个方向?超级安全并且失去了很多构成C++的东西(imo,它不仅仅是语言定义),可能会在以后遇到问题,或者现在必须添加大量的异常处理和其他一些代码?
我很想和Boost一起去,但是1)我不确定它是否会移植到我可能想要使用的每个嵌入式处理器上2)在他们的网站上,他们说他们不保证/推荐它的某些部分对于嵌入式系统(尤其是FSM,这似乎很奇怪).如果我选择Boost,我们会在以后发现问题....
我们有一个包含大量打印消息的守护进程.由于我们正在开发具有弱CPU和其他约束硬件的嵌入式设备,因此我们希望在最终版本中最小化printf消息的任何类型的成本(IO,CPU等).(用户没有控制台)
我的队友和我有分歧.他认为我们可以将所有内容重定向到/ dev/null.它不会花费任何IO,所以感情将是最小的.但我认为它仍将花费CPU,我们最好为printf定义一个宏,这样我们就可以重写"printf"(也许只是返回).
所以我需要一些关于谁是对的意见.Linux是否足够聪明以优化printf?我真的很怀疑.
我需要两个设备(PC和微控制器)之间的简单通信协议.PC必须向微软发送一些命令和参数.微必须传输一个字节数组(来自传感器的数据).
数据必须受到噪声保护(除了奇偶校验,我认为我还需要一些其他的数据校正方法).
有没有标准的解决方案呢?(我只需要一个想法,而不是完整的解决方案).
PS任何建议表示赞赏.PPS对不起任何语法错误,希望你理解.
编辑1.我还没有决定它是主/从协议还是双方都可以发起通信.PC必须知道微工作何时完成工作并且可以发送数据.如果数据准备就绪,它可以连续轮询微观,或者当作业完成时微观可以发送数据.我不知道哪个更好更简单.
编辑2. 硬件和物理层协议.由于PC中使用RS-232 C串行标准,我将使用异步通信.我将只使用RxD,TxD和GND信号.我无法使用额外的电线,因为微控制器AFAIK不支持它们.顺便说一下,我正在使用AVR ATmega128芯片.
所以我将使用固定波特率,8位数据,2个停止位而不进行奇偶校验(或使用?).
我一直很想知道是否有可能将Haskell的强大功能应用到嵌入式实时世界,并且在谷歌搜索中找到了Atom软件包.我假设在复杂的情况下,代码可能具有所有经典的C错误 - 崩溃,内存损坏等,然后需要将其追溯到导致它们的原始Haskell代码.所以,这是问题的第一部分:"如果您有使用Atom的经验,那么您是如何处理调试已编译C代码中的低级错误并将其修复为Haskell原始代码的任务的?"
我搜索了Atom的更多示例,这篇博文提到了生成的C代码22KLOC(显然没有代码:),包含的示例是一个玩具.这个和这个引用有一些更实用的代码,但这是结束的地方.我在这个主题中加入"相当大"的原因是,如果您可以分享使用300KLOC +范围内生成的C代码的经验,我最感兴趣.
因为我是一名Haskell新手,显然可能有其他方法由于我未知的未知因素而未找到,所以在这方面任何其他自我教育的指针都会非常感激 - 这是问题的第二部分 - "在Haskell中进行实时开发会有什么其他实用方法(如果)?" 如果多核也在图片中,这是一个额外的加号:-)
(关于Haskell本身用于此目的的用法:从我在这篇博文中读到的内容,Haskell中的垃圾收集和懒惰使其在调度方面具有相当不确定性,但可能在两年内发生了一些变化.现实世界的Haskell编程问题在SO上是我能找到的最接近这个话题的人)
注意:上面的"实时"将更接近"硬实时" - 我很好奇是否可以确保主要任务未执行的暂停时间小于0.5ms.
embedded ×10
c ×3
c++ ×3
avr-gcc ×1
bison ×1
c89 ×1
dev-null ×1
flex-lexer ×1
haskell ×1
interactive ×1
linux ×1
parsing ×1
performance ×1
protocols ×1
real-time ×1
serial-port ×1
stl ×1
templates ×1
unit-testing ×1