Rtos code cntains bug possible incompatability with I2C
Fork of mbed-rtos by
Diff: rtx/TARGET_CORTEX_A/rt_CMSIS.c
- Revision:
- 85:ef0a22cdf839
- Parent:
- 72:83895f30f8f2
- Child:
- 92:bc9729798a19
--- a/rtx/TARGET_CORTEX_A/rt_CMSIS.c Wed Jun 17 10:00:10 2015 +0100 +++ b/rtx/TARGET_CORTEX_A/rt_CMSIS.c Wed Jun 17 11:15:10 2015 +0100 @@ -442,9 +442,11 @@ extern const uint32_t os_section_id$$Limit; #endif +#ifndef __MBED_CMSIS_RTOS_CA9 // OS Stack Memory for Threads definitions extern uint64_t os_stack_mem[]; extern const uint32_t os_stack_sz; +#endif // OS Timers external resources extern const osThreadDef_t os_thread_def_osTimerThread; @@ -546,6 +548,11 @@ /// Initialize the RTOS Kernel for creating objects osStatus svcKernelInitialize (void) { +#ifdef __MBED_CMSIS_RTOS_CA9 + if (!os_initialized) { + rt_sys_init(); // RTX System Initialization + } +#else int ret; if (!os_initialized) { @@ -557,6 +564,7 @@ rt_sys_init(); // RTX System Initialization } +#endif os_tsk.run->prio = 255; // Highest priority @@ -668,6 +676,13 @@ return NULL; } +#ifdef __MBED_CMSIS_RTOS_CA9 + if (thread_def->stacksize != 0) { // Custom stack size + stk = (void *)thread_def->stack_pointer; + } else { // Default stack size + stk = NULL; + } +#else if (thread_def->stacksize != 0) { // Custom stack size stk = rt_alloc_mem( // Allocate stack os_stack_mem, @@ -680,6 +695,7 @@ } else { // Default stack size stk = NULL; } +#endif tsk = rt_tsk_create( // Create task (FUNCP)thread_def->pthread, // Task function pointer @@ -690,9 +706,11 @@ ); if (tsk == 0) { // Invalid task ID +#ifndef __MBED_CMSIS_RTOS_CA9 if (stk != NULL) { rt_free_mem(os_stack_mem, stk); // Free allocated stack } +#endif sysThreadError(osErrorNoMemory); // Create task failed (Out of memory) return NULL; } @@ -717,20 +735,26 @@ osStatus svcThreadTerminate (osThreadId thread_id) { OS_RESULT res; P_TCB ptcb; +#ifndef __MBED_CMSIS_RTOS_CA9 void *stk; +#endif ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer if (ptcb == NULL) return osErrorParameter; +#ifndef __MBED_CMSIS_RTOS_CA9 stk = ptcb->priv_stack ? ptcb->stack : NULL; // Private stack +#endif res = rt_tsk_delete(ptcb->task_id); // Delete task if (res == OS_R_NOK) return osErrorResource; // Delete task failed +#ifndef __MBED_CMSIS_RTOS_CA9 if (stk != NULL) { rt_free_mem(os_stack_mem, stk); // Free private stack } +#endif return osOK; }