#include "slaveBusIdleDetection.h" #include "semphr.h" static TimerHandle_t J1_485_Swtmr = NULL; static TimerHandle_t J3_485_Swtmr = NULL; static TimerHandle_t J5_485_Swtmr = NULL; static TimerHandle_t J7_485_Swtmr = NULL; static TimerHandle_t J8_485_Swtmr = NULL; static TimerHandle_t J9_485_Swtmr = NULL; static void J1_485_tmrCallback(void* parameter); static void J3_485_tmrCallback(void* parameter); static void J5_485_tmrCallback(void* parameter); static void J7_485_tmrCallback(void* parameter); static void J8_485_tmrCallback(void* parameter); static void J9_485_tmrCallback(void* parameter); // 创建二值信号量 SemaphoreHandle_t J1_IDLESemaphore = NULL; SemaphoreHandle_t J3_IDLESemaphore = NULL; SemaphoreHandle_t J5_IDLESemaphore = NULL; SemaphoreHandle_t J7_IDLESemaphore = NULL; SemaphoreHandle_t J8_IDLESemaphore = NULL; SemaphoreHandle_t J9_IDLESemaphore = NULL; /* 设置延时时间为30mS */ #define softwareDelay (30 / (1000 / configTICK_RATE_HZ)) /* * @brief 初始化所有用于空闲检测的软件定时器和二值变量 * @param * @retval * */ void slaveIdleInit(void) { J1_485_Swtmr = xTimerCreate((const char*)"J1Timer", softwareDelay, //延时 (UBaseType_t )pdFALSE, //单次模式 (void *)1, //为每个计时器分配一个索引的唯一ID (TimerCallbackFunction_t)J1_485_tmrCallback); //回调函数 J3_485_Swtmr = xTimerCreate((const char*)"J3Timer", softwareDelay, (UBaseType_t )pdFALSE, (void *)2, (TimerCallbackFunction_t)J3_485_tmrCallback); J5_485_Swtmr = xTimerCreate((const char*)"J5Timer", softwareDelay, (UBaseType_t )pdFALSE, (void *)2, (TimerCallbackFunction_t)J5_485_tmrCallback); J7_485_Swtmr = xTimerCreate((const char*)"J7Timer", softwareDelay, (UBaseType_t )pdFALSE, (void *)2, (TimerCallbackFunction_t)J7_485_tmrCallback); J8_485_Swtmr = xTimerCreate((const char*)"J8Timer", softwareDelay, (UBaseType_t )pdFALSE, (void *)2, (TimerCallbackFunction_t)J8_485_tmrCallback); J9_485_Swtmr = xTimerCreate((const char*)"J9Timer", softwareDelay, (UBaseType_t )pdFALSE, (void *)2, (TimerCallbackFunction_t)J9_485_tmrCallback); J1_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J1_IDLESemaphore); J3_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J3_IDLESemaphore); J5_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J5_IDLESemaphore); J7_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J7_IDLESemaphore); J8_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J8_IDLESemaphore); J9_IDLESemaphore = xSemaphoreCreateBinary(); xSemaphoreGive(J9_IDLESemaphore); } void J1_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J1_IDLESemaphore, 0); } void J3_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J3_IDLESemaphore, 0); } void J5_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J5_IDLESemaphore, 0); } void J7_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J7_IDLESemaphore, 0); } void J8_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J8_IDLESemaphore, 0); } void J9_485_tmrCallback(void* parameter) { xSemaphoreGiveFromISR(J9_IDLESemaphore, 0); } /* * @brief 空闲中断内容 * @param * @retval * */ void J1_485_IN_IDLE(void) { xTimerStartFromISR(J1_485_Swtmr, 0); } void J3_485_IN_IDLE(void) { xTimerStartFromISR(J3_485_Swtmr, 0); } void J5_485_IN_IDLE(void) { xTimerStartFromISR(J5_485_Swtmr, 0); } void J7_485_IN_IDLE(void) { xTimerStartFromISR(J7_485_Swtmr, 0); } void J8_485_IN_IDLE(void) { xTimerStartFromISR(J8_485_Swtmr, 0); } void J9_485_IN_IDLE(void) { xTimerStartFromISR(J9_485_Swtmr, 0); } /* * @brief 空闲中断后,第一次进入接收中断内容 * @param * @retval * */ void J1_485_IN_RXNE(void) { xTimerStopFromISR(J1_485_Swtmr, 0); xSemaphoreTakeFromISR(J1_IDLESemaphore, 0); } void J3_485_IN_RXNE(void) { xTimerStopFromISR(J3_485_Swtmr, 0); xSemaphoreTakeFromISR(J3_IDLESemaphore, 0); } void J5_485_IN_RXNE(void) { xTimerStopFromISR(J5_485_Swtmr, 0); xSemaphoreTakeFromISR(J5_IDLESemaphore, 0); } void J7_485_IN_RXNE(void) { xTimerStopFromISR(J7_485_Swtmr, 0); xSemaphoreTakeFromISR(J7_IDLESemaphore, 0); } void J8_485_IN_RXNE(void) { xTimerStopFromISR(J8_485_Swtmr, 0); xSemaphoreTakeFromISR(J8_IDLESemaphore, 0); } void J9_485_IN_RXNE(void) { xTimerStopFromISR(J9_485_Swtmr, 0); xSemaphoreTakeFromISR(J9_IDLESemaphore, 0); }