在测试自定义的printf 函数时,发现当传输uint64_t 变量时无法正常解析。
通过Jlink 读取内存检查发现,堆栈中的存储的uint64_t 变量未以8字节对齐,导致va_arg 获取uint64_t 参数错误。 刚开始怀疑是编译器问题,编译器未将写入堆栈中的数据以8字节对齐导致的。 然后测试了写入多个uint64_t 可变参数,验证是否对齐。发现编译器有尝试对齐操作,似乎是栈的SP 指针存在异常。
uint64_t temp = 0x123456789abcdef0;
test_var_list(0, 123, temp, 123,temp);
经过测试在使用MSP 主栈时测试函数正常,但是PSP 的任务栈存测试函数在异常。
经过分析是malloc 的任务栈没有以8字节对齐,在CM3 的开发环境malloc 的任务栈必须以8字节对齐。