stm32和freeRtos的中断优先的问题

cdcc1111 2015-05-26 05:20:39
我使用的是stm32f373配上freeRtos。我在主函数中有四个task。如下
1. xTaskCreate( vBlink_LED, "LED VIE Task", 20 , NULL, tskIDLE_PRIORITY, NULL );
2. xTaskCreate( vCtrlUSART, "USART Task", 300 , NULL, tskIDLE_PRIORITY, NULL );
3. xTaskCreate( Mesure_Task, "Mesure Task", 100 , NULL, tskIDLE_PRIORITY, NULL );
4. xTaskCreate( Feed_watchdog_Task, "Rechargement Task", 100 , NULL, tskIDLE_PRIORITY, NULL );
vTaskStartScheduler();
在这四个函数中,我的第三个task。使用了adc和sdadc用dma定时器自动采样,读取。没40ms进行一次。
中断设置为
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T19_CC3;
void ADC1_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable ADC1_2 IRQChannel */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;//ADC1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
}

task2 usart收发当中使用队列形式,当usart发送一个要求后。micro能够有回复“ACK”(在不插入断点,不进行单步执行时)。但是中间的其中一个函数没有调用。如果我插入断点,进行单步运行。发现它在运行行到需要调用的那个函数的那一行时。被task3中的定时器中断抢先。然后就不会再回到这个函数当中了。
奇怪的是,如果我把task4,看门狗这一行注释掉。那么程序能够正常运行,函数也会被正常调用。
我的看门狗程序如下:
void Feed_watchdog_Task( void *pvParameters )
{
IWDG_Configuration();
while(1)
{
IWDG_ReloadCounter();
vTaskDelay( 8000 );
}
}

void IWDG_Configuration(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* IWDG counter clock: 40KHz(LSI) / 64 = 0.625 KHz */
IWDG_SetPrescaler(IWDG_Prescaler_64);
/* Set counter reload value to 6400*1/(40k/64)=10240ms */
IWDG_SetReload(6400);
IWDG_ReloadCounter();
IWDG_Enable();
}
...全文
552 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
无知的幸福zc 2015-06-05
  • 打赏
  • 举报
回复
是task4进入之后线程就堵塞了吧 你在task4中 IWDG_ReloadCounter()直接写入是不允许的 前面需要加上 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable)在看看。
cdcc1111 2015-06-01
  • 打赏
  • 举报
回复
没有人找到原因吗?
cdcc1111 2015-05-29
  • 打赏
  • 举报
回复
其实就是很一般的测量,三个温度传感器的温度。然后测量一个光电二极管的电压,然后确认两个IO口的输入电平高低。保证每100ms做一次这些。
cdcc1111 2015-05-29
  • 打赏
  • 举报
回复
引用 4 楼 wangfan027 的回复:
看看你的task3怎么写的?
我的task3如下: void Mesure_Task( void *pvParameters ) { SDADC1_NVIC_Configuration(); SDADC1_GPIO_Config(); SDADC1_Config(); /* Initialisation du ADC --Temperature Ambiante/ Capteur Luminance */ ADC1_NVIC_Configuration(); ADC_GPIO_Config(); ADC_Config(); TIM19_INIT(); while(1) { Mesure_TempCuve(); Read_TempAmbiante(); Read_TempElectronique(); Read_CapRef(); Mesure_Ctsecu(); vTaskDelay( 100 ); } }
dceacho 2015-05-27
  • 打赏
  • 举报
回复
看看你的task3怎么写的?
cdcc1111 2015-05-27
  • 打赏
  • 举报
回复
是watchdog 的问题吗,可是我的watchdog的重载时间是10秒。但是我现在8秒就能重载一次,照理来说应该不会出问题啊
cdcc1111 2015-05-27
  • 打赏
  • 举报
回复
真的一点想法,可能的原因都没有吗?
cdcc1111 2015-05-26
  • 打赏
  • 举报
回复
人呢?没有人吗?

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧