工具/软件:TI C/C++编译器
大家好,
我正在尝试解决这个与C程序中使用代码编写器工作室有关的汇编代码问题。 代码编译良好,但在调试过程中,执行会产生错误(当然是不正确的指令代码)。 例如,以下情况将生成故障:
_ASM (" STMFD R0!,{R4}");
_ASM (
//调用存储在状态缓冲区中的R4-R11和SP_PROCESS值
" LDMIA R0!,{R4-R11,R12}\n\t"//存储值
" MSR PSP,R12\n\t"//将R1的内容移至PSP
//使用进程堆栈从还原任务返回
);
因此,以下功能也会产生故障。
void createTask (unsigned *buf,char *stack,task_t task_start,task_t taskFinish)
{
//此行存储寄存器R4-R11和SP的空间
// threads[currThread].savedregs,这是保持状态的缓冲区
//在功能期间不会自动保存的处理器
//边界。 指令系列为每个存储零值
//寄存器,SP除外,SP是输入指针栈的值
_ASM (" MOV R4,#0");
_ASM (" STMFD R0!,{R4}");//R4
_ASM (" STMFD R0!,{R4}");//R5
_ASM (" STMFD R0!,{R4}");//R6
_ASM (" STMFD R0!,{R4}");//R7
_ASM (" STMFD R0!,{R4}");//R8
_ASM (" STMFD R0!,{R4}");//R9
_ASM (" STMFD R0!,{R4}");//R10
_ASM (" STMFD R0!,{R4}");//R11
//将所有寄存器的空间放置到进程堆栈中
//当任务返回时(调用yeild)。 用于寄存器的空间
// R0-R3,R12,ReturnAddress (taskFinish)和xPSR。
__ASM (“MOV R5,R2");//获取task_start的地址
_ASM (" MOV R6,R3");//获取taskFinish的地址
_ASM (" MOV R3,#0x100万");//将R3更改为xPSR值
_ASM (" STMFD R1!,{R3}");//xPSR
_ASM (" STMFD R1!,{R5}");//返回地址
_ASM (" STMFD R1!,{R6}");//R14
_ASM (" STMFD R1!,{R4}");//R12
_ASM (" STMFD R1!,{R4}");//R3
_ASM (" STMFD R1!,{R4}");//R2
_ASM (" STMFD R1!,{R4}");//R1
_ASM (" STMFD R1!,{R4}");//R0
//将R1存储到存储缓冲区中的SP点
_ASM (" STMFD R0!,{R1}");
_ASM (" MOV R4,#0");
_ASM (" STMFD R0!,{R5}");//R5
_ASM (" STMFD R0!,{R6}");//R6
*/
}
是否需要遵循任何设置或编码原则? 我已采纳了中提出的建议
ARM优化C/C++编译器
v 17.3 .0.STS
用户指南。
感谢您的帮助。