This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:在Code Composer Studio for TIVA™︎TM4C1294NCPDT中嵌入汇编代码

Guru**** 2562120 points
Other Parts Discussed in Thread: TM4C129ENCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/589529/compiler-embedding-assembly-code-in-code-composer-studio-for-tiva-tm4c1294ncpdt

主题中讨论的其它部件:TM4C129ENCPDT

工具/软件: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
用户指南。

感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了__asm语句以外的函数应写入手工编码的汇编。  __asm语句用于插入一个无法或难以从C或C++生成的指令(或指令)。  

    如果您的问题更多地涉及这些特定说明在您的情况下不起作用的原因... 您似乎正在实施某种运行时操作系统。  观看此编译器论坛的用户缺乏在该主题上提供帮助所需的专业知识。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亲爱的George:

    是的,我的问题是为什么TI编译器生成的非定义指令二进制代码会导致执行中的错误,即使LDMFD和LDMIA等指令是指令集的一部分(表2-13. Cortex-M4F指令摘要,TIVATmTM4C129ENCPDT微控制器
    在C/C++程序中使用时。

    谢谢!

    Lucien
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我使用TI ARM编译器版本17.3 .0.STS编译C函数时,使用选项--silic_version=7M4,我没有得到任何未定义的指令。  我获得以下拆卸。  请在开始执行之前检查调试器中createTask的反汇编。  是否在反汇编程序窗口中看到无效的指令?  请您发布这些无效说明的屏幕截图吗?

    文本部分.text,0x5E字节(0x0万
    ): createTask:
    0万: 拇指
    0万:F04F0400 MOV.W R4,#0.0004万
    :F8404D04 结构 R4,[R0,#-4]!
    0.0008万:F8404D04 结构 R4,[R0,#-4]!
    0万c:F8404D04 结构 R4,[R0,#-4]!
    0.001万:F8404D04 结构 R4,[R0,#-4]!
    0.0014万:F8404D04 结构 R4,[R0,#-4]!
    0.0018万:F8404D04 结构 R4,[R0,#-4]!
    0.0001万c:F8404D04 结构 R4,[R0,#-4]!
    0.002万:F8404D04 结构 R4,[R0,#-4]!
    0.0024万:4615 MOV R5,R200.0026万
    :461E MOV R6,R300.0028万
    :F04F7380 MOV.W R3,#1677.7216万
    00002c:F8413D04 结构 R3,[R1,#-4]!
    0.003万:F8415D04 结构 R5,[R1,#-4]!
    0.0034万:F8416D04 结构 R6,[R1,#-4]!
    0.0038万:F8414D04 结构 R4,[R1,#-4]!
    0.0003万c:F8414D04 结构 R4,[R1,#-4]!
    0.004万:F8414D04 结构 R4,[R1,#-4]!
    0.0044万:F8414D04 结构 R4,[R1,#-4]!
    0.0048万:F8414D04 结构 R4,[R1,#-4]!
    0.0004万c:F8401D04 结构 R1,[R0,#-4]!
    0.005万:F04F0400 MOV.W R4,#0.0054万
    :F8405D04 结构 R5,[R0,#-4]!
    0.0058万:F8406D04 结构 R6,[R0,#-4]!
    0.0005万c:4770 bx R14
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将安装CCSV7以重新编译和发布我的发现。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果没有安装CCS,可以使用独立的反汇编程序"armdis"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用CS V7生成如下所示的相同代码,但在逐步调试时,执行会产生故障。  

    createTask():
    0.0374万:F04F0400 mov.w R4,#0
    0.0378万:F8404D04 str R4,[r0,#-0x4]!
    0.0037万c:F8404D04 str R4,[r0,#-0x4]!
    0.038万:F8404D04 str R4,[r0,#-0x4]!
    0.0384万:F8404D04 str R4,[r0,#-0x4]!
    0.0388万:F8404D04 str R4,[r0,#-0x4]!
    0.0038万c:F8404D04 str R4,[r0,#-0x4]!
    0.039万:F8404D04 str R4,[r0,#-0x4]!
    0.0394万:F8404D04 str R4,[r0,#-0x4]!
    0.0398万:4615 mov R5,R2
    0.0039万a:461E MOV R6,R3
    0.0039万c:F04F7380 mov.w R3,#0x100万
    0.0003万a0:F8413D04 str R3,[R1,#-0x4]!
    0.0003万a4:F8415D04 str R5,[R1,#-0x4]!
    0.0003万a8:F8416D04 str R6,[R1,#-0x4]!
    0.0003万ac:F8414D04 str R4,[R1,#-0x4]!
    0.0003万b0:F8414D04 str R4,[R1,#-0x4]!
    0.0003万b4:F8414D04 str R4,[R1,#-0x4]!
    0.0003万b8:F8414D04 str R4,[R1,#-0x4]!
    0.0003万bc:F8414D04 str R4,[R1,#-0x4]!
    0.0003万c0:F8401D04 str R1,[r0,#-0x4]!
    0.0003万c4:F04F0400 mov.w R4,#0
    0.0003万c8:F8405D04 str R5,[r0,#-0x4]!
    0.0003万cc:F8406D04 str R6,[r0,#-0x4]!
    0.0003万d0:4770 BX LR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    发生故障时PC是什么? 这是哪一个故障?
    可能是R0或R1中的一个指向无效地址。 写入顺序可能在内存的末尾运行?