我想为Atmel AVR微控制器编写C代码固件.我将使用GCC编译它.此外,我想启用编译器优化(-Os或-O2),因为我认为没有理由不启用它们,并且它们可能比手动编写汇编更快地生成更好的汇编方式.
但我想要一小段没有优化的代码.我想延迟函数的执行一段时间,因此我想写一个do-nothing循环只是为了浪费一些时间.不需要精确,只需等待一段时间.
/* How to NOT optimize this, while optimizing other code? */
unsigned char i, j;
j = 0;
while(--j) {
i = 0;
while(--i);
}
Run Code Online (Sandbox Code Playgroud)
由于AVR中的内存访问速度要慢得多,因此我希望i并将j其保存在CPU寄存器中.
更新:我刚刚发现UTIL/delay.h和UTIL/delay_basic.h从AVR libc库.尽管大多数情况下使用这些功能可能更好,但这个问题仍然有效且有趣.
相关问题:
该LD手册并不能说明什么KEEP命令一样.以下是来自第三方链接器脚本的功能片段KEEP.什么是KEEP命令做ld?
SECTIONS
{
.text :
{
. = ALIGN(4);
_text = .;
PROVIDE(stext = .);
KEEP(*(.isr_vector))
KEEP(*(.init))
*(.text .text.*)
*(.rodata .rodata.*)
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.gcc_except_table)
*(.gnu.linkonce.r.*)
. = ALIGN(4);
_etext = .;
_sidata = _etext;
PROVIDE(etext = .);
_fini = . ;
*(.fini)
} >flash
Run Code Online (Sandbox Code Playgroud) 我的 C 代码中有一个函数被隐式调用,并被链接器转储。我怎样才能防止这种现象?
我正在使用 gcc 和链接器标志 -gc-sections 进行编译,我不想从标志中排除整个文件。我尝试使用属性:“used”和“externally_visible”,但都没有奏效。
void __attribute__((section(".mySec"), nomicromips, used)) func(){
...
}
Run Code Online (Sandbox Code Playgroud)
在地图文件上,我可以看到该函数已编译但未链接。我用错了吗?有没有其他方法可以做到?
我在mylib.h中有这样的代码,然后使用它来创建mylib.so。有没有办法检查.so中如何定义MY_MACROS?
#ifdef SWITCH_CONDITION
#define MY_MACROS 0
#else
#define MY_MACROS 1
#endif
Run Code Online (Sandbox Code Playgroud)
如果那是一个函数,我会简单地做
nm mylib.so | grep myfunction
Run Code Online (Sandbox Code Playgroud)
有没有办法对宏做同样的事情?
PS应该是因为
> grep MY_MACROS mylib.so
> Binary file mylib.so matches
Run Code Online (Sandbox Code Playgroud)