我正在研究的代码应该可以为托管和独立环境构建,为后一种情况提供某些stdlib函数的私有实现.
我可以在普通的工作站/构建服务器上使用GCC进行可靠的测试吗?使用GCC编译独立环境
"-ffreestanding"选项看起来很有前途,但它似乎"只"禁用内置函数并正确设置STDC_HOSTED宏,它仍然提供所有系统头.
选项"-nostdinc"限制性太强; 我仍然想使用独立实现所需的头文件(特别是stddef.h和limits.h).
我在这里错过了什么?
哦,我现在正在使用GCC 4.4.3,很快就会升级到4.5.0.
我正在为 Linux 开发一个静态独立的 nolibc/nostdlib 程序,并希望使用 C 编译器的内存、地址和未定义行为清理程序来改进我的代码。
当我尝试时,我无法让它工作:
clang -static -ffreestanding -nostdlib -fno-omit-frame-pointer -fsanitize=undefined -g -o program program.c
Run Code Online (Sandbox Code Playgroud)
这会导致编译器发出调用诸如__ubsan_handle_type_mismatch_v1@plt. 它编译和链接成功,但程序在运行时在这些引用附近出现段错误。更具体地说,在我的内存分配器中:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) up
(gdb) disas
Dump of assembler code for function lone_reallocate:
...
0x00000000002116d0 <+160>: bl 0x206470 <__ubsan_handle_pointer_overflow@plt>
=> 0x00000000002116d4 <+164>: b 0x2116d8 <lone_reallocate+168>
0x00000000002116d8 <+168>: ldur x8, [x29, #-72]
...
Run Code Online (Sandbox Code Playgroud)
我认为这些函数由于缺乏 libc 支持而丢失。当我尝试使用该-static-libsan选项时,出现许多未定义的符号错误:
error: undefined symbol: __aarch64_cas8_acq_rel
error: undefined symbol: pthread_self
error: undefined symbol: dl_iterate_phdr
error: …Run Code Online (Sandbox Code Playgroud) Arduino平台上的C++程序没有main()其他平台上的功能;相反,它必须有两个名为setup()和 的函数loop()。但是根据 C++ 标准——所有的 C++ 程序都必须有一个main()函数。
那么,这样的C++代码是否符合标准呢?Arduino 上的 C++ 编译器/链接器/加载器是否符合标准?
(如果你的懒惰看到TL的底部; DR)
您好,我打算建立一个处理物理计算的新(原型)项目.基本上,我有电线.这些电线都需要同时读取其电压.每根导线读数之间的差异超过几百微秒就会完全搞砸了.Arduino需要大约114微秒.因此,在延迟会影响读数的准确性之前,我能阅读的最多的是2或3条线.
所以我的计划是让一个Arduino成为一系列ATTinys的"主人".arduino相当狭窄的空间,但它与一个巨大的游乐场相比.ATTiny13A具有1k的闪存ROM(程序空间),64字节的RAM和64字节(非耐用和慢速)EEPROM.(我选择这个价格和尺寸)
我系统中的ATTinys不会做太多.基本上,他们所要做的就是等待来自Master的信号,然后读取1或2线的电压并将其存储在RAM中(如果它变得狭窄,则可能存储在EEPROM中).然后使用1根电线将数据发送给Master.(没有更多空间!).
到目前为止,我所要做的就是实现简单的电压读取代码(使用内置ADC).但这个沟通有点让我担心.您是否认为通信协议(仅使用1线!)甚至可以在这样的约束中实现?
TL; DR:在不到1k的程序空间和64字节的RAM(以及64字节的EEPROM)中,您认为可以实现1线通信协议吗?我是否需要放入装配以使其适合?
我知道目前我的Arduino程序链接到Wiring库超过8k,所以我有点担心.
海湾合作委员会的文件http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html说(下-ffreestanding)独立环境意味着-fno-builtin.我可能误解了一个独立环境是什么或它是如何工作的,但在我看来,由于内置函数通常发出内联代码而不是调用库函数,这对于标准库可能缺失的独立环境来说是理想的.功能甚至完全缺失.
那么为什么我们不想在独立环境中使用biltins呢?
我可以在c ++独立环境中使用哪些功能?我正在开发一个小内核(为了我自己的乐趣),我知道我不能使用整个stdlib库,但还有什么?当我尝试使用new和delete运算符时,它编译时没有麻烦,但链接器说
undefined reference to `operator new[](unsigned long)
undefined reference to `operator delete[](void*)'
Run Code Online (Sandbox Code Playgroud)
我链接-lgcc和-lsupc++选项.我知道异常处理在独立式中是禁用的,但我对新的和删除也有点惊讶.那么我可以使用什么,不能使用什么呢?
我正在开发一个不使用动态内存分配的嵌入式系统程序。如何防止 GCC 生成删除析构函数D0(名称中含有损坏的析构函数)?它永远不会被调用。
我认为甚至不需要删除析构函数,因为可以在其之后调用完整的对象析构函数(以损坏的名称) 。D1operator delete(\xe2\x80\xa6)
在我看来,应该有一些命令行选项来禁用这些析构函数。
\n主要问题是程序调用operator delete(\xe2\x80\xa6)了删除析构函数。由于我没有任何堆管理,因此没有定义这样的函数。作为一种解决方法,我可以实现operator delete(\xe2\x80\xa6)仅报告错误,但这会浪费内存(不必要的大程序大小)并且不允许我operator delete()在编译期间捕获意外调用。
我有以下功能;
template<typename T, typename U, typename... Parameters>
void transform(void (*func)(Parameters...))
{
auto lambda_function = [func](T args, U params)
{
auto combined = std::tuple_cat(args, params);
helper(func, combined);
};
return lambda_function;
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到一个可行的返回类型,或者打电话的方式,我希望能够将其称为相似的;
auto func = transform<std::tuple<char,int>, std::tuple<const char*>>(f);
func(arg, param);
Run Code Online (Sandbox Code Playgroud)
鉴于'f','arg'和'param'为;
void f(char arg1, int arg2, const char* arg3);
std::tuple<char,int> arg = std::tuple<char,int>('C',-3);
std::tuple<const char*> param = std::tuple<const char*>("PO");
Run Code Online (Sandbox Code Playgroud)
任何人都有提示,甚至解决方案?
注意:代码可以在; 连锁
我想创建一个函数来选择C中的另一个,也许这个C伪代码可以帮助澄清我想要的东西:
void set_method(const char *method)
{
// Check if the method is serial_port
if (strcmp(method, "serial_port") == 0)
{
// assign the alias "print" to serial_print
// something like defing here a function like this:
// print(const char *print) { serial_print(print); }
print(const char *print) = serial_print(const char *message)
}
else if (strcmp(method, "graphical_tty") == 0)
{
// The same that serial_port case but with graphical_tty_print
}
else
{
// Error
}
}
Run Code Online (Sandbox Code Playgroud)
目标是在满足条件时为函数分配"别名",我该怎么做?
我正在使用一个独立的C实现,用clang编译.