33#include <string.h>
44#include <rtthread.h>
55
6- #define SHOW_DEBUG_INFO
6+ // #define SHOW_DEBUG_INFO
77volatile portSTACK_TYPE * pxCurrentTCB = 0 ;
88static rt_thread_t cur_old = 0 ;
99extern rt_thread_t rt_current_thread ;
1010static unsigned short mq_index = 0 ;
11+ static char mq_int_req = pdFALSE ;
12+ static char mq_in_int = 0 ;
1113
1214void rt_hw_context_switch (rt_uint32_t from , rt_uint32_t to )
1315{
16+ //skip PendSV in int
17+ if (mq_in_int )
18+ {
19+ mq_int_req = pdTRUE ;
20+ return ;
21+ }
22+ #ifdef SHOW_DEBUG_INFO
23+ ets_printf ("Switch1 cur:%s %d\n" ,rt_current_thread -> name ,WDEV_NOW ());
24+ #endif
1425 PendSV (1 );
26+ #ifdef SHOW_DEBUG_INFO
27+ ets_printf ("Switch2 cur:%s %d\n" ,rt_current_thread -> name ,WDEV_NOW ());
28+ #endif
1529}
1630void rt_hw_context_switch_interrupt (rt_uint32_t from , rt_uint32_t to )
1731{
1832 pxCurrentTCB = (portSTACK_TYPE * )to ;
33+ #ifdef SHOW_DEBUG_INFO
34+ if (cur_old != rt_current_thread )
35+ {
36+ if (cur_old )
37+ ets_printf ("TaskSwitch %s -> %s\n" ,cur_old -> name ,rt_current_thread -> name );
38+ else
39+ ets_printf ("TaskSwitchTo %s\n" ,rt_current_thread -> name );
40+ }
41+ #endif
42+ cur_old = rt_current_thread ;
1943}
2044rt_base_t rt_hw_interrupt_disable (void )
2145{
@@ -80,14 +104,32 @@ void ICACHE_FLASH_ATTR rtthread_startup(void)
80104 rt_thread_idle_init ();
81105}
82106
107+ #if 0
108+ void ICACHE_FLASH_ATTR ff (void * pp )
109+ {
110+ static int iiii = 0 ;
111+ if (iiii == 0 )
112+ {
113+ vPortExitCritical ();
114+ iiii = 1 ;
115+ }
116+ int cc = 0 ;
117+ while (1 )
118+ {
119+ ets_printf ("%d run %d\n" ,pp ,rt_tick_get ());
120+ rt_thread_delay (100 );
121+ }
122+ }
123+ #endif
124+
83125signed portBASE_TYPE ICACHE_FLASH_ATTR xTaskGenericCreate ( pdTASK_CODE pxTaskCode , const signed char * const pcName , unsigned short usStackDepth , void * pvParameters , unsigned portBASE_TYPE uxPriority , xTaskHandle * pxCreatedTask , portSTACK_TYPE * puxStackBuffer , const xMemoryRegion * const xRegions )
84126{
85127 signed portBASE_TYPE xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ;
86- rt_thread_t thread = * pxCreatedTask = rt_thread_create (pcName ,pxTaskCode ,pvParameters ,usStackDepth + 4096 ,20 - uxPriority ,10 );
128+ rt_thread_t thread = * pxCreatedTask = rt_thread_create (pcName ,pxTaskCode ,pvParameters ,usStackDepth ,20 - uxPriority ,10 );
87129 if (* pxCreatedTask != 0 )
88130 {
89131#ifdef SHOW_DEBUG_INFO
90- ets_printf ("TaskCreate name:%s pri:%d size:%d\n" ,pcName ,(20 - uxPriority ),( usStackDepth + 4096 ) );
132+ ets_printf ("TaskCreate name:%s pri:%d size:%d\n" ,pcName ,(20 - uxPriority ),usStackDepth );
91133#endif
92134 rt_thread_startup (* pxCreatedTask );
93135 xReturn = pdPASS ;
@@ -102,24 +144,8 @@ void ICACHE_FLASH_ATTR vTaskDelete(xTaskHandle xTaskToDelete)
102144#ifdef SHOW_DEBUG_INFO
103145 ets_printf ("TaskDelete name:%s\n" ,thread -> name );
104146#endif
105- rt_thread_suspend (thread );
106- }
107- void ICACHE_FLASH_ATTR vTaskSwitchContext (void )
108- {
109- rt_interrupt_enter ();
110- cur_old = rt_current_thread ;
147+ rt_thread_delete (thread );
111148 rt_schedule ();
112- #ifdef SHOW_DEBUG_INFO
113- if (cur_old != rt_current_thread )
114- {
115- if (cur_old )
116- ets_printf ("TaskSwitch %s -> %s\n" ,cur_old -> name ,rt_current_thread -> name );
117- else
118- ets_printf ("TaskSwitchTo %s\n" ,rt_current_thread -> name );
119- }
120- #endif
121- cur_old = rt_current_thread ;
122- rt_interrupt_leave ();
123149}
124150unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxTaskGetStackHighWaterMark ( xTaskHandle xTask )
125151{
@@ -142,6 +168,7 @@ void ICACHE_FLASH_ATTR vTaskDelay(portTickType xTicksToDelay) { rt_thread_delay(
142168void ICACHE_FLASH_ATTR vTaskSuspendAll (void ) { rt_enter_critical (); }
143169signed portBASE_TYPE ICACHE_FLASH_ATTR xTaskResumeAll ( void ) { rt_exit_critical ();return pdTRUE ; }
144170portTickType ICACHE_FLASH_ATTR xTaskGetTickCount (void ) { return rt_tick_get (); }
171+ void ICACHE_FLASH_ATTR vTaskSwitchContext (void ) { rt_interrupt_enter ();rt_schedule ();rt_interrupt_leave (); }
145172void ICACHE_FLASH_ATTR xPortSysTickHandle (void ) { rt_interrupt_enter ();rt_tick_increase ();rt_interrupt_leave (); }
146173
147174xQueueHandle ICACHE_FLASH_ATTR xQueueGenericCreate ( unsigned portBASE_TYPE uxQueueLength , unsigned portBASE_TYPE uxItemSize , unsigned char ucQueueType )
@@ -167,39 +194,67 @@ void ICACHE_FLASH_ATTR vQueueDelete( xQueueHandle xQueue )
167194signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericSend ( xQueueHandle xQueue , const void * const pvItemToQueue , portTickType xTicksToWait , portBASE_TYPE xCopyPosition )
168195{
169196 rt_mq_t mq = xQueue ;
170- rt_err_t err = rt_mq_send (mq ,(void * )pvItemToQueue ,mq -> msg_size );
171197#ifdef SHOW_DEBUG_INFO
172- ets_printf ("QueueSend name:%s wait:%d pos:%d ret:%d\n" ,mq -> parent .parent .name ,xTicksToWait ,xCopyPosition ,err );
198+ ets_printf ("QueueSend cur:%s name:%s wait:%d pos:%d\n" ,rt_current_thread -> name ,mq -> parent .parent .name ,xTicksToWait ,xCopyPosition );
199+ #endif
200+ rt_err_t err = RT_EOK ;
201+ if (xCopyPosition == 0 )
202+ err = rt_mq_send (mq ,(void * )pvItemToQueue ,mq -> msg_size );
203+ else if (xCopyPosition == 1 )
204+ err = rt_mq_urgent (mq ,(void * )pvItemToQueue ,mq -> msg_size );
205+ #ifdef SHOW_DEBUG_INFO
206+ ets_printf ("QueueSendOver cur:%s name:%s ret:%d\n" ,rt_current_thread -> name ,mq -> parent .parent .name ,err );
173207#endif
174208 return (err == RT_EOK )?pdPASS :errQUEUE_FULL ;
175209}
176210signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericSendFromISR ( xQueueHandle xQueue , const void * const pvItemToQueue , signed portBASE_TYPE * pxHigherPriorityTaskWoken , portBASE_TYPE xCopyPosition )
177211{
212+ mq_in_int = 1 ;
213+ mq_int_req = pdFALSE ;
178214 rt_mq_t mq = xQueue ;
179- rt_err_t err = rt_mq_send (mq ,(void * )pvItemToQueue ,mq -> msg_size );
180215#ifdef SHOW_DEBUG_INFO
181- ets_printf ("QueueSendISR name :%s pos:%d ret :%d\n" ,mq -> parent .parent .name ,xCopyPosition , err );
216+ ets_printf ("QueueSendISR cur :%s name:%s pos :%d\n" ,rt_current_thread -> name , mq -> parent .parent .name ,xCopyPosition );
182217#endif
183- if (pxHigherPriorityTaskWoken ) * pxHigherPriorityTaskWoken = pdFALSE ;
218+ rt_err_t err = RT_EOK ;
219+ if (xCopyPosition == 0 )
220+ err = rt_mq_send (mq ,(void * )pvItemToQueue ,mq -> msg_size );
221+ else if (xCopyPosition == 1 )
222+ err = rt_mq_urgent (mq ,(void * )pvItemToQueue ,mq -> msg_size );
223+ #ifdef SHOW_DEBUG_INFO
224+ ets_printf ("QueueSendISROver cur:%s name:%s ret:%d\n" ,rt_current_thread -> name ,mq -> parent .parent .name ,err );
225+ #endif
226+ if (pxHigherPriorityTaskWoken ) * pxHigherPriorityTaskWoken = mq_int_req ;
227+ mq_in_int = 0 ;
228+ mq_int_req = pdFALSE ;
184229 return (err == RT_EOK )?pdPASS :errQUEUE_FULL ;
185230}
186231signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericReceive ( xQueueHandle xQueue , const void * const pvBuffer , portTickType xTicksToWait , portBASE_TYPE xJustPeeking )
187232{
188233 rt_mq_t mq = xQueue ;
234+ #ifdef SHOW_DEBUG_INFO
235+ ets_printf ("QueueRecv cur:%s name:%s wait:%d peek:%d\n" ,rt_current_thread -> name ,mq -> parent .parent .name ,xTicksToWait ,xJustPeeking );
236+ #endif
189237 rt_err_t err = rt_mq_recv (mq ,(void * )pvBuffer ,mq -> msg_size ,xTicksToWait );
190238#ifdef SHOW_DEBUG_INFO
191- ets_printf ("QueueRecv name :%s wait:%d peek:%d ret:%d\n" ,mq -> parent .parent .name , xTicksToWait , xJustPeeking ,err );
239+ ets_printf ("QueueRecvOver cur :%s name:%s ret:%d\n" ,rt_current_thread -> name , mq -> parent .parent .name ,err );
192240#endif
193241 return (err == RT_EOK )?pdPASS :errQUEUE_EMPTY ;
194242}
195243signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueReceiveFromISR ( xQueueHandle xQueue , const void * const pvBuffer , signed portBASE_TYPE * pxHigherPriorityTaskWoken )
196244{
245+ mq_in_int = 1 ;
246+ mq_int_req = pdFALSE ;
197247 rt_mq_t mq = xQueue ;
248+ #ifdef SHOW_DEBUG_INFO
249+ ets_printf ("QueueRecvISR cur:%s name:%s\n" ,rt_current_thread -> name ,mq -> parent .parent .name );
250+ #endif
198251 rt_err_t err = rt_mq_recv (mq ,(void * )pvBuffer ,mq -> msg_size ,0 );
199252#ifdef SHOW_DEBUG_INFO
200- ets_printf ("QueueRecvISR name:%s ret:%d\n" ,mq -> parent .parent .name ,err );
253+ ets_printf ("QueueRecvISROver cur:%s name:%s ret:%d\n" , rt_current_thread -> name ,mq -> parent .parent .name ,err );
201254#endif
202- if (pxHigherPriorityTaskWoken ) * pxHigherPriorityTaskWoken = pdFALSE ;
255+ if (pxHigherPriorityTaskWoken ) * pxHigherPriorityTaskWoken = mq_int_req ;
256+ mq_in_int = 0 ;
257+ mq_int_req = pdFALSE ;
203258 return (err == RT_EOK )?pdPASS :errQUEUE_EMPTY ;
204259}
205260
0 commit comments