我是C++编程的新手,但长期以来一直在使用C和Java.我正在尝试在我正在处理的某些串行协议中执行类似接口的层次结构,并不断收到错误:
Undefined reference to 'operator delete(void*)'
Run Code Online (Sandbox Code Playgroud)
(简化)代码如下:
PacketWriter.h:
class PacketWriter {
public:
virtual ~PacketWriter() {}
virtual uint8_t nextByte() = 0;
}
Run Code Online (Sandbox Code Playgroud)
StringWriter.h:
class StringWriter : public PacketWriter {
public:
StringWriter(const char* message);
virtual uint8_t nextByte();
}
Run Code Online (Sandbox Code Playgroud)
构造函数和nextByte函数在StringWriter.cpp中实现,但没有别的.我需要能够从指向PacketWriter的指针中删除StringWriter,如果我为StringWriter定义了一个析构函数,我是否已经得到了各种其他类似的错误.我敢肯定这是一个简单的问题,我作为一个新手忽略了.
另外,我正在为AVR芯片编写这个,在Windows上使用avr-g ++.
谢谢
我的一位同事遇到了编程ATMega的一些奇怪问题,这与访问输入输出端口有关.
在经过一些研究后观察问题,我得出结论,如果我们的目标是安全的C标准兼容软件,我们应该避免使用可能编译的指令SBI或CBI指令.我正在寻找这个决定是否正义,所以如果我的担忧是有效的.
Atmel处理器的数据表在这里,它是一个ATMega16.我将在下面参考本文档的一些页面.
我将使用WG14 N1256链接下本网站上的版本来参考C标准.
的SBI和CBI所述处理器的指令的位级只访问所讨论的位进行操作.因此,它们不是真正的读 - 修改 - 写(RMW)指令,因为据我所知,它们不执行读取(目标8位SFR).
在上面的数据表的第50页上,第一句开始就像所有AVR端口都具有真正的读 - 修改 - 写功能......,正在进行中它指定这仅适用于具有技术上不是RMW 的SBI和CBI指令的访问.数据表没有定义什么读取,例如PORTx寄存器应该返回(但它表明它们是可读的).所以我假设读取这些SFR是未定义的(它们可能返回写在它们上的最后一件事或当前输入状态或其他).
在页70,它列出了一些外部中断标志,这很有趣,因为这是SBI和CBI指令的性质变得重要的地方.发生中断时会设置标志,可以通过将它们写入一个来清除它们.因此,如果SBI是真正的RMW指令,它将清除所有三个标志,而不管操作码中指定的位.
现在让我们进入C的问题.
编译器本身是真正无关紧要的,唯一重要的事实是它可能在某些情况下使用CBI和SBI指令,我认为它使它不符合要求.
在上面提到的C99标准中,5.1.2.3节执行,第2节和第3节引用了这个(第13页)和6.7.3类型限定符,第6点(第109页).后者提到对具有volatile限定类型的对象的访问构成是实现定义的,但是在它之前的一些短语要求引用这样的对象的任何表达式都应该严格地根据抽象机器的规则进行评估.
另请注意,示例中使用的硬件端口volatile在相应的标头中声明.
例:
PORTA |= 1U << 6;
Run Code Online (Sandbox Code Playgroud)
众所周知,这可以转化为SBI.这意味着volatile(PORTA)对象上只发生Write访问.但是,如果有人写:
var = …Run Code Online (Sandbox Code Playgroud) 我正在研究学校项目,需要使用AVR atmega控制器学习C语言的基础知识.
我不明白一切都是如何建立的.例如PORTB,PORTD,DDRB; DDRD,PINB,PIND等等.我不知道if语句,while循环等是如何工作的.
有人可以给我一个简短的解释吗?
我有一些代码行......
DDRB = 0b00000011; // I know that here DDRB is set to input/output
Run Code Online (Sandbox Code Playgroud)
并且if语句:
if (PINB & (1 << PINB0)){
A = true;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个"if语句"是如何工作的吗?为什么PINB & (1<< PINB0))?
谢谢
我正在使用SIM900 GSM模块连接到我的AVR微控制器.我用FT232测试它以查看传输数据.First Micro发送AT它会响应OK
AT OK
AT+CMGF=1 OK
AT+CMGS="+9893XXXXXX" returns ERROR and doesn't show ">"
Run Code Online (Sandbox Code Playgroud)
谁能告诉我该怎么办?
编译gcc 4.6.2时出现问题:
checking for avr-gcc... /data/data6/soft/src_build/gcc-4.6.2/host-x86_64-unknown-linux-gnu/gcc/xgcc -B/data/data6/soft/src_build/gcc-4.6.2/host-x86_64-unknown-linux-gnu/gcc/ -B/data/data6/soft/programming/gcc-avr/avr/bin/ -B/data/data6/soft/programming/gcc-avr/avr/lib/ -isystem /data/data6/soft/programming/gcc-avr/avr/include -isystem /data/data6/soft/programming/gcc-avr/avr/sys-include
checking for suffix of object files... configure: error: in `/data/data6/soft/src_build/gcc-4.6.2/avr/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
Run Code Online (Sandbox Code Playgroud)
在我的gcc-4.6.2/avr/libgcc/config.log中,我发现:
configure:3268: /data/data6/soft/src_build/gcc-4.6.2/host-x86_64-unknown-linux-gnu/gcc/xgcc -B/data/data6/soft/src_build/gcc-4.6.2/host-x86_64-unknown-linux-gnu/gcc/ -B/data/data6/soft/programming/gcc-avr/avr/bin/ -B/data/data6/soft/programming/gcc-avr/avr/lib/ -isystem /data/data6/soft/programming/gcc-avr/avr/include -isystem /data/data6/soft/programming/gcc-avr/avr/sys-include -c -g -O2 conftest.c >&5
exec: 89: -o: not found
configure:3272: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Runtime Library"
| #define PACKAGE_TARNAME …Run Code Online (Sandbox Code Playgroud) 我听说人们使用光传感器,盖革计数器和其他物理传感器来生成随机数,但我持怀疑态度.有没有办法通过测量物理世界(使用Arduino或任何其他微控制器)生成随机数?如果是这样,这些数字是否真的是随机的?
澄清:问题是关于使用微控制器收集的数据生成随机数的可行性,这些随机数可以合理地应用于密码学 - 是依赖设备熵的替代方案.
我基于L298N芯片制造了这个电机屏蔽,以控制一个水箱的两个电机.它将引脚5和6用于一个电机,而引脚10和11用于另一个电机.
在尝试添加TSOP 4838以便使用IR遥控器控制油箱时,我注意到在10/11引脚上反向移动电机只能在全速运行 - 即引脚11上的HIGH(255)值.低于该值不会在引脚11上输出任何内容(这些引脚上的测量电压为0 V).
对于遥控器,我使用这个库.该IR接收器连接在引脚2(但销并不重要).问题是库代码本身.启用IR监听的行irrecv.enableIRIn();是导致问题的原因.我了解到内部Arduino定时器和屏蔽用于PWM的引脚存在冲突.
这是反向驱动电机的代码:
#include <IRremote.h>
// IR receiver configuration
const int irPin = 2;
IRrecv irrecv(irPin);
// Motors configuration
const int mLeftPin1 = 10;
const int mLeftPin2 = 11;
const int mRightPin1 = 5;
const int mRightPin2 = 6;
void setup()
{
// Start IR
irrecv.enableIRIn();
// Setup motors
pinMode(mLeftPin1, OUTPUT);
pinMode(mLeftPin2, OUTPUT);
pinMode(mRightPin1, OUTPUT);
pinMode(mRightPin2, OUTPUT);
// Move left motor in reverse, slower speed …Run Code Online (Sandbox Code Playgroud) 我想在全局标头中将引脚定义声明为一条简单的行,例如:
#define STATUS_LED B,7
Run Code Online (Sandbox Code Playgroud)
然后,我想将此引脚定义传递给以上功能:
CMBset_out(STATUS_LED);
Run Code Online (Sandbox Code Playgroud)
我不知道该如何处理-MY_PIN格式正确,可以在预编译阶段替换。
#define CMBsbi(port, pin) (PORT##port) |= (1<<pin)
#define CMBset_out(port,pin) (DDR##port) |= (1<<pin)
// define pins
#define STATUS_LED B,7
Run Code Online (Sandbox Code Playgroud)
Then, I want to pass this pin definition to function above (hw_init_states() is declared in the same header file called from main C file):
// runtime initialization
void hw_init_states(){
#ifdef STATUS_LED
CMBset_out(STATUS_LED);
#endif
}
Run Code Online (Sandbox Code Playgroud)
But I get a compilation error:
Error 1 macro "CMBset_out" requires 2 arguments, but only 1 given GENET_HW_DEF.h 68 23 Compass …Run Code Online (Sandbox Code Playgroud) 查看AVR指令集,2010年增加了四条指令
LAC load and clear
LAS load and set
LAT load and toggle
XCH load and exchange
Run Code Online (Sandbox Code Playgroud)
有谁知道芯片有这些说明
哪些工具支持这些说明
有关他们所做工作的更多信息
(Z)< - Rd v(Z),Rd < - (Z)
这是否意味着Rd和(Z)获得相同的值或者Rd获得Z指向的预修改值?
目前编码atmel tiny45微控制器,我使用了几个查找表.存放它们的最佳位置在哪里?你能给我一个关于sram-flash-eeprom之间内存速度差异的一般概念吗?