1:所有类似printf的可变参数函数,其可变形参对应的实参必须是栈变量,不能是全局/静态变量;因为va_list就是在栈的上下文工作,如果实参位于静态区,则访问不到。
形如 ... 的参数列表都是从右向左压栈,所以最右侧的表达式最先执行
{ static int a = 3; printf("%d", a); } 错误,打印不出3;
{ int a = 3; printf("%d", a); } 正确 ,打印出3;
2:函数的参数是从右向左入栈,且发生调用时实参是最后入栈的,即从主调函数的栈底(就是被调函数的栈顶)逐个+4往上退就是传给被调函数从左向右的实参值。
因此假设A调用B,则从B入口栈顶+4就是B函数最左边参数的地址值。
3:系统调用(syscall)通过寄存器传递参数,因此在进行系统调用前需要备份系统调用中用到的寄存器的值到RAM中,不过在内联汇编中这个工作会被编译器自动代劳,即编译内联汇编代码时会由编译器自动生成汇编指令完成对内联汇编中用到的寄存器的压栈 / 备份操作。
4:对“中断的处理能够像函数调用一样”的理解:函数调用会由编译器隐式生成压出栈的汇编代码,而中断发生和退出时会由硬件自动去做同样的事,硬件并没有生成汇编代码,而是直接操作硬件起到和汇编代码一样的实际效果
5:0 按4 向上对齐是 0;1-4 按4 向上对齐是 4;5-8 按4 向上对齐是 8;0-3 按4 向下对齐是 0;4-7 按4 向下对齐是 4;8-11 按4 向下对齐是 8;
向下取整 : #define PALIGN_DOWN(x, align) (x & ~(align - 1))
向上取整 : #define PALIGN_UP(x, align) ((x + (align - 1)) & ~(align - 1))
6:彩色打印
#define WRAP "\n"
#if ( configUSE_COLOR_PRINTF == 1)
#define NONE "\033[0m"
#define RED "\033[1;32;31m"
#define BACK_RED "\033[0;41;37m"
#define FLASH_RED "\033[1m\033[5;32;31m"
#define GREEN "\033[1;32;32m"
#define BACK_GREEN "\33[0;42;37m"
#define FLASH_GREEN "\033[1m\033[5;32;32m"
#define BLUE "\033[1;32;34m"
#define BACK_BLUE "\033[0;44;37m"
#define FLASH_BLUE "\033[1m\033[5;32;34m"
// \n is not needed at the end of x
#define red_dprintf(x, ...) do { printf( RED x NONE WRAP, ##__VA_ARGS__); } while (0)
#define green_dprintf(x, ...) do { printf( GREEN x NONE WRAP, ##__VA_ARGS__); } while (0)
#define blue_dprintf(x, ...) do { printf( BLUE x NONE WRAP, ##__VA_ARGS__); } while (0)
#define redb_dprintf(x, ...) do { printf( BACK_RED x NONE WRAP, ##__VA_ARGS__); } while (0)
#define greenb_dprintf(x, ...) do { printf( BACK_GREEN x NONE WRAP, ##__VA_ARGS__); } while (0)
#define blueb_dprintf(x, ...) do { printf( BACK_BLUE x NONE WRAP, ##__VA_ARGS__); } while (0)
#define redf_dprintf(x, ...) do { printf( FLASH_RED x NONE WRAP, ##__VA_ARGS__); } while (0)
#define greenf_dprintf(x, ...) do { printf( FLASH_GREEN x NONE WRAP, ##__VA_ARGS__); } while (0)
#define bluef_dprintf(x, ...) do { printf( FLASH_BLUE x NONE WRAP, ##__VA_ARGS__); } while (0)
#else
// \n is not needed at the end of x
#define red_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define green_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define blue_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define redb_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define greenb_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define blueb_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define redf_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define greenf_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#define bluef_dprintf(x, ...) do { printf( x WRAP, ##__VA_ARGS__); } while (0)
#endif //( configUSE_COLOR_PRINTF == 1)
7: