我正在研究一种连接两个微控制器的方法.在序列化的层面上,我正在考虑使用Nano protobuffers(http://code.google.com/p/nanopb/).这样我就可以编码/解码消息并在两个处理器之间发送它们.
基本上,一个小型处理器将是RPC服务器,能够执行多个功能.较大的处理器将通过发送的消息调用RPC,然后当数据准备好时,它将从较小的处理器读取它.
使用UART,I2C或SPI的优缺点是什么?
邮件将在发送之前放入邮箱中.
最好的问候,Drasko
开始在计算机外编程的最佳方法是什么?
我不是指像API这样的手机这样的主流产品.
请假设有C/C++的工作知识
虽然有很多单元测试框架支持C,但我对如何为微控制器代码编写单元测试感到有点困难(在我的情况下是PIC,但我认为问题比这更普遍).
为微控制器编写的大部分代码都围绕将配置和数据值写入寄存器,从寄存器读取输入数据以及响应中断事件.我想知道是否有人可以提供一些最有效的方法指针.
微控制器通常需要读取寄存器以清除某些状态条件.在C中是否有可移植的方式来确保在不使用数据的情况下不优化读取?指向内存映射寄存器的指针是否足以声明为volatile?换句话说,以下是否始终适用于标准兼容编译器?
void func(void)
{
volatile unsigned int *REGISTER = (volatile unsigned int *) 0x12345678;
*REGISTER;
}
Run Code Online (Sandbox Code Playgroud)
我知道处理这样的功能会遇到编译器相关的问题.所以,在这种情况下,我对便携式设备的定义有点松散.我只是说它会尽可能广泛地使用最流行的工具链.
我已经为模拟器构建了一些代码,现在我正在尝试使用TI的免费工具链来交叉编译到64kb的nvram目标.编译器声称我的代码大约是ROM以外的34kb:
(...) msp430-elf/bin/ld: region `ROM' overflowed by 33716 bytes
Run Code Online (Sandbox Code Playgroud)
另一条线说它不适合.text场地进入其分配的空间.我无法相信我的总数增加了34kb,更不用说使二进制文件溢出这个数量了.
-Os -s标志.math.h函数(实际上它是唯一进行浮点运算的部分),调用strtod和调用sprintf是否有任何工具或方法来分解导致二进制文件如此庞大的原因?
我正在寻找替代编程语言(从汇编,C,C++和基础)到嵌入式(微控制器)编程.
例如,可以用C#或Java编程微控制器吗?也许Ruby或Python?
如果可能,请发布使用的开发工具和硬件.
我想编写一个微控制器(AVR)来通过USB控制一些LED.这只是对如何构建和编程USB设备感兴趣.有些AVR微控制器支持USB协议,或者我自己可以在另一个微控制器中实现USB协议,但我想知道在计算机上使用什么来编写自己的驱动程序.
我的系统编程水平:总菜鸟(因此问题)
那么,为了更好地了解USB技术以及如何编写自己的驱动程序以及其他内容,您的人们会建议哪些文献?
PS:我知道:
C(可能需要它)
Java(这里可能不需要它)
Python(希望可以在这里使用)
汇编程序(希望在这里XD不需要它).
...
PPS:不同操作系统的驱动程序开发有所不同.我使用Linux和Windows,因此欢迎任何与这些系统中的一个或两个相关的材料.
我有一个Arduino Uno(很棒的小装置!).它有两个中断; 我们称他们为0和1.我使用attachInterrupt():http://www.arduino.cc/en/Reference/AttachInterrupt将一个处理程序连接到中断0,另一个处理程序用于中断1 .
中断0被触发,它调用它的处理程序,它执行一些数字运算.如果在触发中断1时中断0的处理程序仍在执行,会发生什么?
中断1中断中断0,还是中断1等待,直到中断0的处理程序执行完毕?
请注意,这个问题与Arduino有关.
embedded microcontroller arduino interrupt interrupt-handling
我正在寻找一种算法来乘以两个比下面更好的整数.你有一个好主意吗?(MCU - AT Tiny 84/85或类似 - 此代码运行的地方没有mul/div运算符)
uint16_t umul16_(uint16_t a, uint16_t b)
{
uint16_t res=0;
while (b) {
if ( (b & 1) )
res+=a;
b>>=1;
a+=a;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
当使用avr-gcc编译器为AT Tiny 85/84编译时,该算法几乎与avr-gcc生成的算法__mulhi3相同.
avr-gcc算法:
00000106 <__mulhi3>:
106: 00 24 eor r0, r0
108: 55 27 eor r21, r21
10a: 04 c0 rjmp .+8 ; 0x114 <__mulhi3+0xe>
10c: 08 0e add r0, r24
10e: 59 1f adc r21, r25
110: 88 0f add r24, r24
112: 99 1f adc r25, …Run Code Online (Sandbox Code Playgroud) 在过去,我已经使用8位AVR和MSP430进行了大量工作,其中RAM和闪存都直接存储在芯片上.当你编译和下载你的程序时,它有点"正常",你不必担心变量的实际存储位置和方式.
现在我开始一个项目,我希望能够为微控制器添加一些外部存储器(如果重要的话,可以使用TI Stellaris LM3S9D92),但我不完全确定如何使用外部RAM.我可以看到你如何配置外部总线与其他外围设备非常相似,但令我困惑的是处理器如何跟踪何时与外部存储器通信以及何时与内部存储器通信.
据我所知,外部RAM映射到与内部SRAM相同的地址空间(内部从0x20000000开始,外部从0x60000000开始).这是否意味着我写了这样的东西:
int* x= 0x20000000;
int* y= 0x60000000;
Run Code Online (Sandbox Code Playgroud)
x和y是否分别指向内部和外部RAM的前4个字节(假设32位整数)?如果是这样,如果我做了这样的事情怎么办:
int x[999999999999]; //some super big array that uses all the internal ram
int y[999999999999]; //this would have to be in external ram or it wouldn't fit
Run Code Online (Sandbox Code Playgroud)
我想我需要讲一些关于每种类型存储器的界限或者我是否完全错误并且硬件自己解决的问题?链接器脚本是否处理此问题?我知道他们与内存映射有关,但我不知道到底是什么.在阅读了有关如何设置ARM交叉编译器之后,我感觉像winavr(avr-gcc)之类的东西在幕后为我做了很多这样的事情,所以我不必处理它.
很抱歉有点乱,但如果有人能告诉我,如果我在这条东西的正确轨道上,我真的很感激.
更新
对于任何未来的读者,我在另外几个小时的谷歌搜索http://www.bravegnu.org/gnu-eprog/index.html找到了这个.结合答案,这对我帮助很大.