lautnerxing 2024-12-11 15:29 采纳率: 0%
浏览 17

做Can时间同步的时候Stbm模块调用OS Api报OS_STATUS_DISABLEDINT的错误

问题描述:在配置完CanTsyn和Stbm后,调试时Stbm模块在调用OS Api的时候报OS_STATUS_DISABLEDINT的错误,参考文档后发现是因为要手动去实现临界区的控制,需要在调用OS Api之前先禁用中断,但是手动实现后,还是依然报错误

img

img

img

img

img

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-12-13 23:52
    关注
    让码农阿豪来帮你解答,本回答参考通义千问qwen-plus模型编写提供,如果还有疑问可以评论或留言
    ### 问题分析

    根据你的描述,你在配置完CanTsyn和Stbm模块后,在调试过程中遇到了一个错误 OS_STATUS_DISABLEDINT。这个错误通常表示在调用操作系统API时,中断已经被禁用,但系统期望中断是启用的。参考文档后,你发现需要手动实现临界区的控制,即在调用OS API之前禁用中断,但在实际操作中仍然报错。

    解决方案

    1. 检查中断禁用和启用的实现

      • 确保在调用OS API之前正确地禁用了中断。
      • 确保在调用OS API之后正确地启用了中断。
    2. 检查临界区的范围

      • 确保临界区的范围是正确的,不要过于宽泛或过于狭窄。
    3. 检查OS API的调用顺序

      • 确保在调用OS API之前没有其他地方意外地启用了中断。

    示例代码

    假设你使用的是一个典型的嵌入式系统,以下是一个示例代码,展示了如何正确地禁用和启用中断:

    #include "os.h"  // 假设这是你的操作系统头文件
    
    // 定义中断状态变量
    uint32_t interrupt_status;
    
    void enter_critical_section() {
        // 保存当前中断状态并禁用中断
        interrupt_status = OS_EnterCritical();
    }
    
    void exit_critical_section() {
        // 恢复之前的中断状态
        OS_ExitCritical(interrupt_status);
    }
    
    void some_function() {
        enter_critical_section();
        
        // 调用OS API
        OS_Status status = OS_CallSomeAPI();
        if (status != OS_STATUS_SUCCESS) {
            // 处理错误
            handle_error(status);
        }
        
        exit_critical_section();
    }
    
    void handle_error(OS_Status status) {
        // 根据错误类型进行处理
        switch (status) {
            case OS_STATUS_DISABLEDINT:
                // 中断被禁用时调用API
                // 可能需要重新设计临界区
                break;
            // 其他错误处理
            default:
                break;
        }
    }
    

    详细步骤

    1. 定义中断状态变量

      • 使用一个变量来保存当前的中断状态,以便在退出临界区时恢复。
    2. 进入临界区

      • 调用 OS_EnterCritical() 函数来禁用中断,并保存当前的中断状态。
    3. 调用OS API

      • 在临界区内调用需要的OS API。
    4. 退出临界区

      • 调用 OS_ExitCritical() 函数来恢复之前的中断状态。
    5. 错误处理

      • 如果调用OS API失败,根据返回的状态码进行相应的错误处理。

    注意事项

    • 确保中断状态的保存和恢复

      • 在进入临界区时保存中断状态,在退出临界区时恢复中断状态,以避免影响其他部分的正常运行。
    • 检查其他地方的中断控制

      • 确保在调用OS API之前没有其他地方意外地启用了中断。
    • 调试工具

      • 使用调试工具(如JTAG、GDB等)来跟踪中断状态的变化,帮助定位问题。

    通过以上步骤和示例代码,你应该能够解决 OS_STATUS_DISABLEDINT 错误,并确保临界区的正确实现。如果问题仍然存在,请提供更多的代码和配置信息,以便进一步诊断。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月11日