In FreeRTOS, critical sections protect code from interruption by disabling interrupts using taskENTER_CRITICAL(). This ensures the critical code runs safely without interference. After the critical code finishes, taskEXIT_CRITICAL() re-enables interrupts so the system can respond to events again. Interrupts start enabled, get disabled at Step 1, stay disabled during critical code at Step 2, and are re-enabled at Step 3. If interrupts were not disabled, other code could interrupt and cause data corruption. Also, interrupts must be re-enabled after the critical section to avoid system freezes. FreeRTOS supports nested critical sections by counting entries and only enabling interrupts after the last exit call.