C++ 在llvm中读/写Arduino端口

C++ 在llvm中读/写Arduino端口,c++,arduino,clang,llvm,llvm-c++-api,C++,Arduino,Clang,Llvm,Llvm C++ Api,为了避免ab解释,简而言之,我的问题是: 我想通过代码> LLVM < /COD> C++ ++ API来阅读和写入D端口。 写 阅读: 阅读更多: 我想知道如何通过llvm读取/写入Arduino端口。我不是在追求一个特定的AVR微控制器,只是需要一般的知识 我的努力是一事无成的。我不确定我需要的东西是否得到了支持 我在当地试过 main.cpp void foo(){ DDRD = 0xFF; PORTD = 12; } 叮当声:错误:未知参数:'-mmcu=atmeg

为了避免ab解释,简而言之,我的问题是:

<>我想通过代码> LLVM < /COD> C++ ++ API来阅读和写入D端口。 写

阅读:


阅读更多:

我想知道如何通过
llvm
读取/写入Arduino端口。我不是在追求一个特定的AVR微控制器,只是需要一般的知识

我的努力是一事无成的。我不确定我需要的东西是否得到了支持

我在当地试过

main.cpp

void foo(){
    DDRD = 0xFF;
    PORTD = 12;
}
叮当声:错误:未知参数:'-mmcu=atmega328p'


如何通过
llvm::AllocaInst
实现这一点?或者通过
llvm::LoadInst
读取此端口

我主要追求
C++api
解决方案。IR llvm对我来说并不理想,但它将帮助我最终找到主要问题的答案

LLVM C++ ++ API/P> 没有。那些话并不是你所暗示的意思。“LLVM C++ API”不在你编译的程序内,例如,ARDUNO。有关详细信息,请参见本答案末尾的下一行。如果你实际上有LLVM C++ API,那么你不会问这个问题,因为登记访问与任何其他常数指针撤销没有太大的区别,并且不需要特殊的处理。 首先请注意,Arduino是一个概念,而不是任何特定的CPU。您至少需要参考特定的Arduino模型,例如UNO,但最好使用像AVR这样的特定体系结构

假设这就是您想要的:AVR上没有“端口”,所以您不需要做任何特殊的事情。只要用给定的固定地址写入内存,C和C++都支持所有敏感的平台。 外围设备和CPU控制寄存器是内存映射的。因此,假设在地址0x1234处有一个字节宽的控制寄存器。您可以将其定义为:

#include <stdint.h>
...
#define CREG (*(volatile uint8_t*)0x1234)
也可以使用只读寄存器:

constexpr volatile const char &RXD0 = *(volatile const char)0x5678;

RXD0 = 3; // won’t compile
char c = RXD0; // will compile OK
有时您需要执行多步骤操作来访问寄存器,例如,首先设置一些地址寄存器,然后通过访问寄存器间接加载它。访问器功能做得很好:

enum class AREG_ : uint8_t { QREG = ... };
constexpr volatile AREG_ &AREG = *(volatile AREG_*)0x3456;

inline void setQREG(uint8_t val) { AREG = AREG_::QREG; BREG = val; }

LLVMAPI由工具使用,即由使用LLVM分析代码或生成代码的软件使用。您不能从使用LLVM编译的任意程序中使用LLVM API,就像您不能从Arduino IDE targeting AVR中使用gcc API一样,后者使用avrg++为AVR目标编译

LLVM IR是前端产生的,而你,所以我也不知道你为什么问这个问题


我还是不知道你想做什么。你能用简单的话解释一下吗?你只是想用叮当声编译一个任意的Arduino程序吗?您的问题尤其令人困惑,因为您使用的词语具有明确的技术含义,但您使用它们的方式组合起来没有任何意义。

没有,因为不太可能有人知道您想要实现的目标。同时,您还讨论了如何使用LLVM构建一些东西,以及如何使用LLVMAPI或IR。您的声明“我想知道如何通过LLVM读取Arduino端口”毫无意义。你想知道如何从C++程序编译,或者当你自己生成IR,或者什么。这个问题令人费解。请把你的想法说清楚。您的第一个问题是在llvm的构建中没有AVR目标,或者您没有正确命名它。请确保您了解哪些目标是可用的。@UnslanderMonica,正如我所说的,我正在寻找LLVM api。但如果没有人知道,我至少对IR感到满意。你在这个问题上没有说任何自相矛盾的话。为什么您认为您需要LLVM API?你这是什么意思?看起来你把事情搞混了。LLVM API不用于使用LLVM编译的应用程序内部。它用于代码生成器、代码分析器、LLVM过程/后端等。如果您询问如何从使用LLVM编译的C/C++代码生成特定于目标的I/O端口输出指令,您必须查看目标的文档,以了解将用于此的内部函数。非常感谢您的回答。我用LLVM C++ API开发了一个用于ARDUNO目标的编译工具。我的工具是C++,我想我可能有一些想法。如果内存映射端口的地址是1234,则生成值56对其的写入涉及(ConstantInt::get(…,56),(ConstantInt::get(…,1234),…),…);
#include <stdint.h>
...
#define CREG (*(volatile uint8_t*)0x1234)
constexpr volatile uint8_t &CREG = *(volatile uint8_t)0x1234;
...
CREG = 42;
constexpr volatile const char &RXD0 = *(volatile const char)0x5678;

RXD0 = 3; // won’t compile
char c = RXD0; // will compile OK
enum class AREG_ : uint8_t { QREG = ... };
constexpr volatile AREG_ &AREG = *(volatile AREG_*)0x3456;

inline void setQREG(uint8_t val) { AREG = AREG_::QREG; BREG = val; }