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.

[参考译文] TMS570LC4357:从用户模式提高特权模式

Guru**** 2393835 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1357674/tms570lc4357-raising-privilege-mode-from-user-mode

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我遇到的问题是,我想访问 MCU 的控制寄存器来启动我正在写入的 PWM 函数的时基时钟。  

在 Halcogen 已经生成了一个文件来执行该操作。 但我需要特殊访问。 我已经尝试写入以访问 以下特权模式  

在 CCS 中、它抛出错误、指出指定的是非法助记符。  

有人能弄清楚吗?

香港特别行政区






































 

政府 // Swi 处理程序函数 __attribute__((interrupt ("swi"))) void SWI_Handler (void) { //调用 Fsys_RaisePrivilege 函数 FSYS_RaisePrivilege(); } int32_t Fsys_RaisePrivilege (void) { int32_t asm_result; //汇编代码提升权限 _asm ( "Mrs R12、spsr\n"//将 SPSR 复制到本地寄存器 R12中 "ands r0、R12、#0x0F\n"//对 R12和0x0F 执行按位与运算 "MOV R1、r0\n"//将结果移动到 R1寄存器 "orreq R12、R12、#0x1F\n"//对 R12和0x1F 执行逻辑或 "msreq spsr_c、r12\n"//将结果有条件地加载到控制字段掩码字节中 "MOV %0、R1\n"//将结果移动到全局变量 ASM_RESULT :"=r"(ASM_RESULT )//输出操作数定义 ://无输入操作数 :"R0","R1","R12"//木体寄存器 ); //返回 asm 中存储的结果 返回 ASM_RESULT; } * 这是下面的另一个尝试 * #包含 //声明一个全局变量来存储结果 //#pragma SWI_ALIAS (FSYS_RaisePrivilege、1); extern long Fsys_RaisePrivilege (void); // Swi 处理程序函数 __attribute__((interrupt ("swi"))) void SWI_Handler (void) { //调用 Fsys_RaisePrivilege 函数 FSYS_RaisePrivilege(); } #pragma FUNC_ALWAYS_INLINE (FSYS_SwitchToUserMode) 静态内联空 Fsys_SwitchToUserMode (void){ __ asm (" cps #0x10"); } extern long Fsys_RaisePrivileed() { _asm (" Mrs R12、spsr"); _asm ("ands r0、R12、#0x0F"); _asm ("orreq R12、R12、#0x1F"); _asm ("msreq spsr_c、r12"); __ asm ("bx r14"); } 香港特区政府 为什么编译器不能识别汇编代码? 请注意、我没有使用 FreeRTOS。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ethan:

    过去、我们创建了一个示例项目来将用户模式转换为特权模式。

    您能否参阅以下示例工程:

    e2e.ti.com/.../5226.USERMODE_5F00_TO_5F00_SVCMODE_5F00_LC4357.zip

    --
    谢谢。此致、
    Jagadish。

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

    你好,Jagadish,

    谢谢,我尝试了这个代码,但在运行了切换到特权模式的汇编代码后,它被卡在 svcEntry 中,

    现在我已经尝试在 Halcogen 上启用这个中断,如果启用了监控器就会被调用,如果禁用了,无限循环就会被调用为 Halcogen。

    启用此中断、我将在 CCS 上收到链接错误。

    另一个问题是、如果您确实需要返回寄存器中存储的内容、   

    示例: "MOV  %0、r0"       //将结果移动到值

        :"=r"(值)        //输出操作数定义,不起作用

    这不像在特权模式下操作那么重要、

    有什么我错过的?  

    谢谢  

    伊坦

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

    尊敬的 Ethan:

    您能否确保您也使用相同的中断配置:

    --
    谢谢。此致、
    Jagadish。

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

      

    这是显示寄存器组 M 位处于受监控模式10011的内容。 上面的中断配置也和我使用的一样。  

     它卡在 Svc 条目处

    好的、我们的目标是进入这种特权模式、这样我就可以启动 PWM 模块的基于时间的时钟。 下面是我调用进入特权模式的代码片段  

      

    这是从 您发送的示例代码中使用的函数。

    目标是进入原始模式,然后返回到 codeflow。 我没有做什么

    谢谢  

    伊坦  

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

    尊敬的 Ethan:

    我的中断矢量 asm 代码如下:

    尝试进行一次此更改。

    --
    谢谢。此致、
    Jagadish。

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

    你好,Jagdish  

    我已经弄清楚为什么它不工作的文件没有显示,在.map 文件,它显示未定义. 原因是 asm 文件有不同的名称。 我想说明的另一点是、您需要 将0x83e70b13和0x95a4f1e0写入 KICK 寄存器、以 启用对 PINMMR 的写入访问。

    我正在执行此操作、现在可以正常工作、但我没有看到 KICK 寄存器的值会更新 0x83e70b13和0x95a4f1e0  。 其他一切都在正常工作。 您能告诉我为什么吗?

    谢谢  

    伊坦

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

    尊敬的 Ethan:

    我正在执行此操作,但我没有看到 KICK 寄存器更新 0x83e70b13和0x95a4f1e0的值  。 其他一切都在正常工作。 您能告诉我为什么吗?

    这只是预期行为:

    读取 KICK REG0和 KICK REG1始终会返回0。 您只需要编写:

       PinMuxReg->KICKER0 = 0x83E70B13U;
       PinMuxReg->KICKER1 = 0x95A4F1E0U;

    以启用引脚多路复用。

    还请验证以下主题以确认相同内容:

    (+) TMS570LC4357:写入 IOMM KICKER0和 KICKER1无效-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。