@@ -100,11 +100,15 @@ osStatus_t osKernelInitialize (void) {
100100 stat = osErrorISR ;
101101 }
102102 else {
103- #if defined(RTE_RTOS_FreeRTOS_HEAP_5 )
104- vPortDefineHeapRegions (xHeapRegions );
105- #endif
106- KernelState = osKernelReady ;
107- stat = osOK ;
103+ if (KernelState == osKernelInactive ) {
104+ #if defined(RTE_RTOS_FreeRTOS_HEAP_5 )
105+ vPortDefineHeapRegions (xHeapRegions );
106+ #endif
107+ KernelState = osKernelReady ;
108+ stat = osOK ;
109+ } else {
110+ stat = osError ;
111+ }
108112 }
109113
110114 return (stat );
@@ -170,9 +174,13 @@ osStatus_t osKernelStart (void) {
170174 stat = osErrorISR ;
171175 }
172176 else {
173- KernelState = osKernelRunning ;
174- vTaskStartScheduler ();
175- stat = osOK ;
177+ if (KernelState == osKernelReady ) {
178+ KernelState = osKernelRunning ;
179+ vTaskStartScheduler ();
180+ stat = osOK ;
181+ } else {
182+ stat = osError ;
183+ }
176184 }
177185
178186 return (stat );
@@ -214,10 +222,12 @@ int32_t osKernelUnlock (void) {
214222 else {
215223 switch (xTaskGetSchedulerState ()) {
216224 case taskSCHEDULER_SUSPENDED :
217- if (xTaskResumeAll () == pdTRUE ) {
218- lock = 1 ;
219- } else {
220- lock = (int32_t )osError ;
225+ lock = 1 ;
226+
227+ if (xTaskResumeAll () != pdTRUE ) {
228+ if (xTaskGetSchedulerState () == taskSCHEDULER_SUSPENDED ) {
229+ lock = (int32_t )osError ;
230+ }
221231 }
222232 break ;
223233
@@ -248,9 +258,14 @@ int32_t osKernelRestoreLock (int32_t lock) {
248258 vTaskSuspendAll ();
249259 }
250260 else {
251- if (( lock != 0 ) || ( xTaskResumeAll () != pdTRUE ) ) {
261+ if (lock != 0 ) {
252262 lock = (int32_t )osError ;
253263 }
264+ else if (xTaskResumeAll () != pdTRUE ) {
265+ if (xTaskGetSchedulerState () != taskSCHEDULER_RUNNING ) {
266+ lock = (int32_t )osError ;
267+ }
268+ }
254269 }
255270 break ;
256271
0 commit comments