|
是这样的,我想把裸机的程序移植到RTOS中,然后第一次是想用任务通知,外部上升沿触发任务通知,然后ADC开始采集,按理说采集完之后 应该会进入ADC的回调函数,我在ADC回调函数用了信号量还有任务通知都没用触发我的另外一个任务,我就怀疑是不是根本没有进入ADC的回调函数,请求大佬解答一波
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 处理GPIO_PIN_1的中断事件
{
BaseType_t xGPIO_risingTaskWoken = pdFALSE;
if (GPIO_Pin == GPIO_PIN_1)
{
// g_adc3_dma_start_flag = 1; // 设置采集完成标志位,开始采集
/* 发送任务通知*/
vTaskNotifyGiveFromISR(ADCTaskHandle,&xGPIO_risingTaskWoken);
portYIELD_FROM_ISR(xGPIO_risingTaskWoken);//进行一次任务调度
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) //采集完成回调函数
{ BaseType_t xADC_ConvCpltTaskWoken = pdFALSE;
if(hadc->Instance==ADC3)
{
// g_adc3_dma_complete_flag = 1;//采集完成标志
HAL_ADC_Stop_DMA(&hadc3);
xSemaphoreGiveFromISR(ADC_BinarySemHandle,&xADC_ConvCpltTaskWoken);
// vTaskNotifyGiveFromISR(defaultTaskHandle,&xADC_ConvCpltTaskWoken);
portYIELD_FROM_ISR(xADC_ConvCpltTaskWoken);//进行一次任务调度
}
}
void StartDefaultTask(void *argument) //adc回调函数里面触发任务通知进行数据处理的,我现在是想先通过打印试一下
{
/* init code for USB_HOST */
// MX_USB_HOST_Init();
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
// printf(" Successfully1");
BaseType_t result = xSemaphoreTake(ADC_BinarySemHandle,portMAX_DELAY);
if(result == pdTRUE)
{
printf(" Successfully22");
}
// BaseType_t result1 = ulTaskNotifyTake(pdFALSE,portMAX_DELAY);
// if(result1 == pdTRUE){
// printf(" Successfully22");
// }
}
void ADC_DMATask(void *argument) 由外部上升沿触发的中断里进行任务通知开始的ADC采集任务
{
/* USER CODE BEGIN ADC_DMATask */
/* Infinite loop */
for(;;)
{
BaseType_t result = ulTaskNotifyTake(pdFALSE,portMAX_DELAY);
if( result == pdTRUE)
{
HAL_ADC_Start_DMA(&hadc3,(uint32_t *)g_adc3_dma_data,ADC_DATA_LENGTH);
printf("ADC IS RUNNING!");
}
// vTaskDelete(NULL);
}
/* USER CODE END ADC_DMATask */
}
|
|