小编Sam*_*all的帖子

在Visual Studio 2012中构建之前保存所有文件?

在Visual Studio 2010中,工具 - >选项 - >项目和解决方案 - >构建并运行 - >构建之前(保存所有更改)下有一个设置.在VS 2012中,此设置似乎已消失,我的解决方案在构建之前未保存.请注意,我正在构建的项目是一个带有Clang/LLVM的MakeFile项目,用于编译器,如果这是相关信息.

我错过了什么地方?

ide visual-studio visual-studio-2012

18
推荐指数
1
解决办法
3963
查看次数

在编译时强制执行静态存储

我有一个结构,我想强制执行静态存储.这是DSP上的矢量类型,并且意外地在堆栈上声明它是导致堆栈溢出,性能问题或两者的用户的常见错误.据我所知,这是不可能的,但我很好奇,如果有其他人知道的更好.

用例示例:

static Vector64 v1;  // OK
static Vector64 v2;  // OK
static Vector64 result; // OK
result = v1 * v2; // OK

Vector64 v3; // I would like this to give a compile-time error
Vector64 v4;
result = v3 * v4;
Run Code Online (Sandbox Code Playgroud)

我的编译器是Clang/LLVM 3.2,编译器特定的属性是公平的游戏.

c c++

6
推荐指数
1
解决办法
225
查看次数

内联ASM的非传统呼叫

我正在使用一个专有的MCU,它有一个内置的金属库(掩模ROM).我正在使用的编译器是clang,它使用类似GCC的内联ASM.我遇到的问题是调用库,因为库没有一致的调用约定.虽然我找到了一个解决方案,但我发现在某些情况下,编译器会在调用之前立即对clobber进行优化,我认为我的工作方式有问题.这是我正在使用的代码:

int EchoByte()
{
    register int asmHex __asm__ ("R1") = Hex;
    asm volatile("//Assert Input to R1 for MASKROM_EchoByte"
            :
            :"r"(asmHex)
            :"%R1");
    ((volatile void (*)(void))(MASKROM_EchoByte))(); //MASKROM_EchoByte is a 16-bit integer with the memory location of the function
}
Run Code Online (Sandbox Code Playgroud)

现在这有一个明显的问题,即当变量"asmHex"被声明为寄存器R1时,实际调用不使用它,因此编译器"不知道"在调用时保留R1.我使用以下代码来消除这种情况:

int EchoByte()
{
    register int asmHex __asm__ ("R1") = Hex;
    asm volatile("//Assert Input to R1 for MASKROM_EchoByte"
            :
            :"r"(asmHex)
            :"%R1");
    ((volatile void (*)(void))(MASKROM_EchoByte))();
    asm volatile("//Assert Input to R1 for MASKROM_EchoByte"
            :
            :"r"(asmHex)
            :"%R1");
}
Run Code Online (Sandbox Code Playgroud)

这对我来说真的很难看,而且应该有更好的方法.另外我担心编译器可能会在两者之间做一些废话,因为调用本身并没有表明它需要asmHex变量.不幸的是,((volatile void(*)(int))(MASKROM_EchoByte))(asmHex)不起作用,因为它将遵循C-convention,它将参数放入R2 +(R1保留用于刮擦)

请注意,遗憾的是,更改Mask ROM库是不可能的,并且有太多常用的例程在C/C++中重新创建它们.

干杯,谢谢.

编辑:我应该注意,虽然我可以调用ASM块中的函数,但编译器对无调用函数进行了优化,并且通过调用汇编看起来没有调用.如果有某种方式指示内联ASM包含函数调用,我可以使用此路由,但否则返回地址可能会被破坏.在任何情况下我都无法找到办法.

c c++ embedded clang inline-assembly

5
推荐指数
1
解决办法
715
查看次数

在编译时生成模板参数

我创建了一个看起来像数组的类,但它不是将数据保存在程序本身中,而是从文件中流出字节(以减少RAM影响).现在我已经完成了所有这些工作,但程序员必须使用以下方法定义类:

#define CreateReadOnlyBlock(name, location, size, ...)          \
template<>                                                      \
const unsigned int ReadOnlyBlock<location, size>::Data[]        \
    __asm__( ".readonly__" #location "__" #name)                \
    = { __VA_ARGS__ };                                          \
ReadOnlyBlock<location, size> name;
Run Code Online (Sandbox Code Playgroud)

例:

//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3); 
Run Code Online (Sandbox Code Playgroud)

请注意,这是针对嵌入式处理器的,并且asm指令通过汇编程序中的工具来创建只读文件.

所以这是我的问题:如何消除"位置"和"大小"变量?我讨厌程序员必须手动输入,并且更喜欢在编译时生成这些的方法.所以代替程序员需要输入:

//A read only array at location 0 of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray1, 0, 4, 0, 1, 2, 3); 
//A read only array at location 4 of {4, 5, 6, 7}
CreateReadOnlyBlock(readOnlyArray2, …
Run Code Online (Sandbox Code Playgroud)

c++ embedded c-preprocessor c++11

5
推荐指数
1
解决办法
298
查看次数