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.

[参考译文] MSP432E401Y:采用 RTOS 实现的 CAN 功能

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1362830/msp432e401y-can-functionality-with-rtos-implementation

器件型号:MSP432E401Y

您好!  
我将基于 RTOS 的示例项目与 CAN 通信一起用于车辆控制单元实现。  
我有一个线程来处理状态图(比如说 A)、另一个线程只为 can_read ()并行运行(比如 B)
我的问题如下:
由于时间分片、当线程 A 正在运行时、CAN 总线上接收到的消息最好被存储在硬件
当线程 B 恢复运行时、它是处理存储在缓冲区中的消息、还是直接处理总线上当前的消息?

在后一种情况下、这不会导致我们丢失大量消息吗?在前一种情况下、用于存储消息供将来处理的内部缓冲区的大小是多少?  

提前感谢您!

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

    您好!

     如果线程 B 比 A 更重要、那么你应该将 B 的任务优先级设置为高于 A。CAN 模块将消息存储在它的消息存储器中。 有32个消息对象可保存消息。 除非所有消息(根据消息 ID 和接受过滤器)保存到同一消息对象中、否则将在硬件中设置 MSG 丢失滞后。

    接收数据帧
    报文处理器将来自 CAN 控制器接收移位寄存器的报文存储到
    报文 RAM 中的报文对象相匹配。 数据字节、所有仲裁位和 DLC 位、
    都存储到相应的报文对象中。 通过这种方式、数据字节连接到
    仲裁掩码也可以与标识符相关联。 CANIFnMCTL 寄存器的 NEWDAT 位
    设置为指示已接收到新数据。 CPU 在读取本标志位时应当将本标志位清零
    报文对象、向控制器指示已收到报文、缓冲区已挂起
    以接收更多消息。 假如 CAN 控制器接收到一条报文、并且 NEWDAT 位也自动置位、
    CANIFnMCTL 寄存器的 MSGLST 位已置位、表示之前的数据
    丢失了。 假如系统需要在成功接收完一帧后产生中断、则寄存器的 RXIE 位将
    CANIFnMCTL 寄存器必须置位。 在这种情况下、同一寄存器的 INTPND 位将被置位、从而
    CANINT 寄存器、指向刚刚接收报文的报文对象。 TXRQST 位
    应当将该报文对象的位清零、以免发送远程帧。