基质喷涂
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.4 KiB

  1. #include "can_config.h"
  2. // 初始化静态成员变量
  3. CanConfig* CanConfig::instance = nullptr;
  4. osMutexId_t CanConfig::mutex = nullptr;
  5. class CanConfigHelper
  6. {
  7. public:
  8. CanConfigHelper()
  9. {
  10. osMutexAttr_t attr;
  11. attr.name = "CanConfigMutex";
  12. attr.attr_bits = 0U;
  13. attr.cb_mem = nullptr;
  14. attr.cb_size = 0U;
  15. // attr.stack_mem = nullptr;
  16. // attr.stack_size = 0U;
  17. // attr.priority = osPriorityNormal;
  18. CanConfig::mutex = osMutexNew(&attr);
  19. if (CanConfig::mutex == nullptr) {
  20. // 处理互斥锁创建失败的情况
  21. }
  22. }
  23. ~CanConfigHelper()
  24. {
  25. if (CanConfig::mutex != nullptr) {
  26. // 释放互斥锁
  27. osMutexDelete(CanConfig::mutex);
  28. CanConfig::mutex = nullptr;
  29. }
  30. }
  31. };
  32. CanConfigHelper can_config_helper;
  33. // 私有构造函数实现
  34. CanConfig::CanConfig() : can_frame_id(0) {
  35. }
  36. // 静态方法,获取单例实例
  37. CanConfig* CanConfig::getInstance() {
  38. // 双重检查锁定,提高性能
  39. if (instance == nullptr) {
  40. // 获取互斥锁
  41. osMutexAcquire(mutex, osWaitForever);
  42. if (instance == nullptr) {
  43. instance = new CanConfig();
  44. }
  45. // 释放互斥锁
  46. osMutexRelease(mutex);
  47. }
  48. return instance;
  49. }
  50. // 设置 CAN 帧 ID
  51. void CanConfig::setCanFrameId(uint32_t id) {
  52. can_frame_id = id;
  53. }
  54. // 获取 CAN 帧 ID
  55. uint32_t CanConfig::getCanFrameId() const {
  56. return can_frame_id * CAN_FRAME_RANGE;
  57. }