jjzjj

embedded

全部标签

具有 volatile 和外部数据访问的 C++ 常量正确性

我是一名嵌入式C开发人员,最近开始在嵌入式设备上处理C++代码,并且不确定当类访问内存映射寄存器或外部设备上的数据等volatile数据时,const正确性如何应用,例如模数转换器(ADC)。例如,我有一些类通过指针访问设备的内存映射寄存器来连接到设备的硬件模块,如下所示:classIOPin{public:/*Constructor,destructor,othermethods...*///shouldthisbeaconstmethod?boolReadIOState(){returnportregs_->state;}private:/*Otherprivatestuff...

c++ - 带中断的互斥安全(嵌入式固件)

编辑@Mike指出我下面代码中的try_lock函数是不安全的,并且访问器创建也会产生竞争条件。(来自每个人的)建议使我确信我走上了错误的道路。原始问题嵌入式微Controller上的锁定要求与多线程不同,我无法将多线程示例转换为我的嵌入式应用程序。通常我没有任何类型的操作系统或线程,只有main以及硬件定期调用的任何中断函数。我需要从中断中填充缓冲区是很常见的,但在main中处理它是很常见的。.我创建了IrqMutex下面的类来尝试安全地实现这一点。每个试图访问缓冲区的人都通过IrqMutexAccessor被分配了一个唯一的ID。,那么他们每个人都可以try_lock()和unlo

c++ - 如何对齐堆栈上的缓冲区?

我正在尝试实现一个按大小对齐的内存缓冲区,以便我可以使用DMAController的模数功能来实现环形缓冲区。我知道我可以用memalign做到这一点,但我想知道是否可以在堆栈上这样做,因为到目前为止我已经能够避免动态内存。我正在使用GCC4.4.1,我不关心可移植性(嵌入式系统)。我想做这样的事情:templateclasssampler{__attribute__((aligned(buffer_size*num_channels*2)))uint16_tbuffer[buffer_size][num_channels];};但是GCC当然不会接受非常量对齐(并且似乎表明对齐>8可

c++ - 为什么 Vtables 在嵌入式平台上没有被正确实现?

我正在为嵌入式系统(特别是PSoC5,使用PSoCCreator)开发代码,并使用C++编写代码。虽然我已经克服了使用C++的大部分障碍,但首先使用编译器标志-xc++在C++中进行编译,定义new和delete运算符,确保不会抛出异常编译器标志-fno-exception,在使用虚函数时我遇到了障碍。如果我尝试声明一个虚函数,编译器会给我错误undefinedreferenceto"vtablefor__cxxabiv1::__class_type_info"。解决这个问题的唯一方法是使用编译器标志-fno-rtti,它可以防止错误并使其编译成功。但是,如果我这样做,嵌入式程序会在尝

c++ - 如何在eclipse上调试图像处理项目?

在工作中,我们拥有丰富的使用旧版本代码编写器(CC3.3)为TIDSP平台开发图像处理应用程序的经验。我们正在使用Eclipse(由Xilinx开发和分发)过渡到ARM平台。在旧的代码编辑器中,我们经常使用的一个功能是看一个IDE小部件,它可以将特定内存区域显示为位图图像。它有一个属性网格,您可以在其中定义大小、像素格式和步幅方向等内容,以将内存块正确解释为图片。该工具还具有一些不错的功能,例如缩放、灰度计数器、线条轮廓、直方图等。eclipse有类似的东西吗?如果没有,创建一个有多困难?我的意思是,为eclipse创建一个从jtag接口(interface)中的内存位置提取信息的准系

c++ - 为 ARM mbed 编译 PicoTCP 时未定义对 pico_dhcp_server_initiate 的引用

我正在从事一个必须使用PicoTCP的项目(请参阅https://developer.mbed.org/users/daniele/code/PicoTCP/,我使用的是该库的旧版本)。在我的main.cpp文件中,我有以下代码:#include"pico_stack.h"#include"pico_dhcp_server.h"intmain(void){//createDHCPserverstructpico_dhcpd_settingss={};s.my_ip.addr=long_be(0x0a280001);/*10.40.0.1*/pico_dhcp_server_initia

c++ - __FUNCTION__ 上的 PSTR()

使用avr-gcc可以将数据存储在程序内存中以节省RAM。这是使用PROGMEMattribute完成的.AVR-libc还提供了一个宏,PSTR(),可用于文字字符串。现在我正在尝试将PSTR()与__func__,__FUNCTION__or__PRETTY_FUNCTION__.一起使用以下代码按预期工作,display.message(__func__,2);display.message(__FUNCTION__,2);display.message(__PRETTY_FUNCTION__,2);,当任何这些行的编译失败时,display.messageP(PSTR(__fu

c++ - Arduino:如果比较参数

我正在尝试启动并运行一个小型BMP085气压计项目。我希望能够在不同的操作模式(MODE_PRESSURE和MODE_ALT)之间切换。我将MODE_PRESSURE和MODE_ALT定义为constint。constintMODE_PRESSURE=1;//displaypressureandtempconstintMODE_ALT=2;//displayaltituderelativetosealevelintmode;//storesthecurrentmodevoidsetup{mode=MODE_PRESSURE;}voidloop{//Readmodebuttonandse

c++ - 没有全局运营商的裸机新

考虑安全软件,其中通常不允许动态分配并且不允许异常。仅当类显式定义运算符new时才允许动态分配和delete.使用运算符new对于其他类应该导致编译失败。在所述情况下导致编译失败的最简单方法是删除全局新运算符:void*operatornew(std::size_t)=delete;一方面,这会对标准库造成副作用。例如包括将包含传播到通过.使用::new即使您不想使用异常和内存分配,运算符也会导致构建失败。根据ScootMeyers应该是裸机友好的。另一方面,这会导致编译器内置运算符出错src/main.cpp:91:31:error:deleteddefinitionof'void*

c++ - 将 Child 对象数组传递给接受 Parent* 的函数

我在功能有限的嵌入式平台上工作,因此vector/STL不可用。这可能是一个微不足道的问题,但我在C++方面没有太多经验(只有C和C#,这可能使我对明显的C++方法视而不见)。考虑以下示例:classParent{};classChild:publicParent{};voidTest(Parent*parents,uint8_tparentCount){//Accessingparent[x]isproblematicwhen'parents'containsaderivedtype}intmain(){//ThisisOKParentparents[3];Test(parents,