中级会员
 
- 积分
- 241
- 金钱
- 241
- 注册时间
- 2022-8-24
- 在线时间
- 134 小时
|
发表于 2026-3-1 11:52:21
|
显示全部楼层
void test_single_critical(void)
{
printf("=====================================\r\n");
printf("【测试1】单级临界区\r\n");
printf("=====================================\r\n");
uint32_t tick_before = g_systick_count;
printf("进入临界区前,SysTick计数:%d\r\n", tick_before);
// 进入临界区(中断关闭)
EnterCritical();
printf("已进入临界区,开始延时500ms(中断应关闭)...\r\n");
delay_ms(500); // 临界区内延时,SysTick中断关闭,计数不增加
uint32_t tick_in = g_systick_count;
printf("临界区内,SysTick计数:%d(应与进入前一致)\r\n", tick_in);
// 退出临界区(中断恢复)
ExitCritical();
printf("已退出临界区,等待200ms...\r\n");
delay_ms(200); // 中断恢复,SysTick计数增加
uint32_t tick_after = g_systick_count;
printf("退出临界区后,SysTick计数:%d(应增加)\r\n", tick_after);
// 验证结果
if(tick_in == tick_before && tick_after > tick_in)
{
printf("单级临界区测试通过\r\n");
}
else
{
printf("单级临界区测试失败\r\n");
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==1) /*更新中断置1*/
{
g_systick_count++;
// printf("\r\n[SysTick] 心跳:%d ms(中断正常)\r\n", g_systick_count);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
使用定时器2来进行g_systick_count++操作,利用void test_single_critical(void)函数测试临界区代码,串口打印的结果如下:
进入临界区浅琒ysTick计数:250
已进入临界区,开始延时500ms(中断应关闭)...
[2026-03-01 11:45:11.826]
RX:临界区内,SysTick计数:253(应与进入前一致)
已退出临界区,等待200ms...
[2026-03-01 11:45:12.029]
RX:退出临界区后,SysTick计数:456(应增加)
单级临界区测试失败
说明了临界区代码测试失败。 |
|