我正在为我的大学开展一个小组高级项目,并且在尝试使我的代码工作时遇到了一个主要障碍.
我们为8位Atmel微控制器提供的编译器不支持new或delete运算符,并且它不支持C++ STL.我可以用C编程,但是我必须实现一个我从未做过的A*算法.虽然我最初尝试过C,但我很快意识到我以前从未做过纯C.尝试使用结构和函数对对象进行建模正在减慢我的速度,因为我已经习惯了更清晰的C++语法.
无论如何,我的编译器缺点的确切措辞可以在这里找到:http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus
为了克服它们并仍然使用C++,我考虑了以下可能性.1)不要分配任何东西,只需使用模板在堆栈上生成固定数组.2)在为对象分配空间后,分配并找到一些hack来调用对象的构造函数.由于new不是运营商,因此不能选择新的展示位置.3)只需使用C并将其吸收,它是一个微控制器为什么我会变得喜欢?4)找到一个更好的编译器,可能会花费$$$.
第二种选择是最难的,但就我如何编写这段代码而言,它将获得最大的回报.但是,我想如果我弄错了调试它可能是一个巨大的痛苦.我正在考虑在堆栈上创建对象,将它们的位复制到分配的空间中,然后将对象中的位清零,这样它就不会调用它的析构函数.为此,我将使用unsigned char指针和sizeof运算符直接访问这些位以获取字节数.
这听起来很糟糕,我不知道它是否可以正常工作,但我正在考虑它.我知道vtable可能有问题,但我不打算使用任何vtable,因为它只是一个8位微控制器.
如果我要编程一个微控制器(ATMega128)与扬声器播放一个真实的话,我该怎么做?
我是否需要使用数字/模拟转换器发送不同的幅度值,或者频率变化是否足够?在任何情况下,我如何编码扬声器需要接收的频率和幅度值?我需要某种频率复用吗?我不是说用扬声器制作简单的声音,就像一个音符然后另一个音符.我想播放一首真正的歌曲,包括所有乐器,人声等.
我正在使8051微控制器与计算机进行无线通信.微控制器将字符串发送到其串行端口(DB9),计算机将接收该字符串并对其进行操作.
我的问题是我不知道如何让8051只传输一次字符串.由于我需要在PC端操作字符串,因此必须只接收一次.目前,即使在C代码中我发送一次字符串,在我的计算机上我连续收到相同的字符串.我认为这是因为SBUF中的任何内容都是连续传输的.有什么方法可以只发送一次我的字符串吗?有没有办法清空SBUF?
我试图在DB9上使用RTS(请求发送)引脚(第7个引脚),因为我读到某个地方,如果我否定了该引脚上的电压,它将阻止数据流到串行端口.所以我所做的是编程我的微控制器发送字符串,然后将逻辑电平0发送到连接到我的DB9 RTS引脚的输出引脚.但是,这没有用.
有没有人有什么建议?我真的很感激他们.
我在PC上使用的软件是Xbee模块的X-CTU.这是我的微控制器上的代码:
include reg51.h
void SerTx(unsigned char);
void main(void)
{
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
SerTx('O');
SerTx('N');
SerTx('L');
SerTx('Y');
}
void SerTx(unsigned char x)
{
SBUF = x;
while(TI==0);
TI = 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以验证它实际上只发送一次字符串吗?
看起来像史蒂夫,布鲁克斯和尼尔,当他们说这是我的主要功能导致问题之后发生的事情时,头部钉在头上.我刚刚尝试了Steve提出的建议代码(更具体地说是for(;;);并在main之外定义了serTX)并且它工作得很好.控制器可能重新启动,因此相同的代码不断重复.
非常感谢你的帮助!:)
我和我的同学正在决定选择一个简单的微控制器来进行非常基本的图像处理.我们基本上试图实现模板匹配,以在图像的特定部分中查找一组对象.我们想使用连接网络摄像头到微控制器来完成工作拍摄照片并查找对象.我们还需要基本的无线通信(例如蓝牙或wifi).
我不认为我们会有使用最先进的微控制器的奢侈品,但有些东西已经存在了一段时间(由于预算和东西).任何人都可以建议微控制器的哪些规格与上述任务最相关(例如CPU,MIPS等).
非常感谢!
我在想,因为它似乎有所不同(例如WFI和WFE是单独的指令),但我无法确切地指出这一点.
实际上malloc如何获得微控制器中可用的当前空闲存储空间.它是否保留了运行时中未连续分配的区域列表?如果代码中有两个malloc语句,它如何获取先前malloc赋值内存分配的信息
如何知道哪个内存是空闲的,哪个内存不在运行时.在编译时,我们可以知道编译器为变量分配RAM中的所有位置.malloc是否使用此信息执行此操作.
我是C编程的新手,我想将一个十六进制代码(38)发送到8个引脚(在视差螺旋桨微控制器上),这样第一个引脚变为0,下一个引脚变为0,下一个引脚变为0引脚获得1,等等.然后将二进制代码发送到每个引脚会更容易.
顺便说一下,这是C代码.到目前为止我使用的代码,通过使用二进制工作是:
//int port[] = {27,26,25,24,23,22,21,20};
int i = 8;
while(i >0)
{ //while start
--i;
low(27);
low(26);
high(25);
high(24);
high(23);
low(22);
low(21);
low(20);
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将一个十六进制代码(38)发送到引脚20到27.
我有一些使用GCC构建的固件,它运行在基于ARM Cortex M0的微控制器上.构建当前生成单个二进制映像,可以将其写入微控制器的程序存储器中.
由于与字段更新有关的原因,我需要将此图像分成两个部分,可以单独更新.我将这些称为Core和App.
核心:包含中断向量表,main()例程以及各种驱动程序和库例程.它将位于程序存储器的前半部分.
应用:包含特定于应用程序的代码.它将位于程序存储器的后半部分.它将在一个已知地址处有一个入口点,由核心调用以启动应用程序.它将通过已知地址访问核心中的功能和数据.
这里有一些明显的限制,我很清楚:
构建应用程序时,需要知道核心中符号的地址.因此必须首先构建核心,并且在链接应用程序时必须可用.
应用程序映像仅与其构建的特定核心映像兼容.
可以在不更新核心的情况下更新应用程序,但反之亦然.
所有这一切都没问题.
我的问题很简单,我如何使用GCC和GNU binutils构建这些图像?
基本上我想像正常的固件映像一样构建核心,然后构建应用程序映像,应用程序将核心视为库.但是,共享链接(这将需要动态链接机制)或静态链接(将复制用于应用程序二进制文件的核心功能)都不适用于此处.我正在尝试做的事情实际上要简单得多:使用已知的固定地址链接现有的二进制文件.我不清楚如何用这些工具做到这一点.
我和我的同事之间U就十六进制表示的文字后缀有一些争论.请注意,这不是关于此后缀的含义或其后果的问题.我在这里找到了几个主题,但我没有找到我的问题的答案.
一些背景资料:
我们试图达成一套我们都同意的规则,从那时起就将它作为我们的风格.我们有一份2004年Misra C规则的副本,并决定将其作为起点.我们对完全符合Misra C标准不感兴趣; 我们正在挑选我们认为最能提高效率和稳健性的规则.
上述准则第10.6条规定:
"U"后缀应适用于所有无符号类型的常量.
我个人认为这是一个很好的规则.它只需要很少的努力,看起来比显式转换更好,并且更明确地显示了常量的意图.对我来说,将它用于所有未签名的内容是有意义的,而不仅仅是数字,因为通过允许异常来执行规则不会发生,特别是对于常用的常量表示.
但是,我的同事认为十六进制表示不需要后缀.主要是因为我们几乎只使用它来设置微控制器寄存器,并且在将寄存器设置为十六进制常量时,符号性无关紧要.
我的问题
我的问题不在于谁是对还是错.它是关于确定是否存在后缀的缺失或存在改变操作结果的情况.有没有这样的情况,还是一致性问题?
编辑:澄清; 特别是关于通过为它们分配十六进制值来设置微控制器寄存器.是否会出现后缀可能会产生影响的情况?我觉得不会.例如,飞思卡尔处理器专家将所有寄存器分配生成为无符号.
我开始在Arduino上使用端口,而不是手动将每个引脚设置为低电平或高电平.这非常有用且速度更快.我正在进行一个项目,我需要至少一个完整端口(8位)和至少一个串行端口.
我想使用Arduino UNO,但它只有一个完整的端口,端口D. PD0和PD1用于串行通信.这意味着我不能使用端口D.
我想知道是否有可能将多个端口合并为"虚拟端口".最后我想要这样的东西:
PORTX = 0b11111111; // the first 2 bits are PB0/PB1 and bit 3-8 are PD3-PD8
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
microcontroller ×10
c ×6
embedded ×5
arduino ×2
8051 ×1
arduino-c++ ×1
arm ×1
atmega ×1
binutils ×1
c++ ×1
electronics ×1
gcc ×1
linker ×1
port ×1
serial-port ×1