Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f79dd1b

Browse files
增加调试代码
1 parent 1d6c103 commit f79dd1b

File tree

4 files changed

+91
-28
lines changed

4 files changed

+91
-28
lines changed

lib/libmain.a

0 Bytes
Binary file not shown.

third_party/freertos/libcpu.c

Lines changed: 83 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,43 @@
33
#include <string.h>
44
#include <rtthread.h>
55

6-
#define SHOW_DEBUG_INFO
6+
//#define SHOW_DEBUG_INFO
77
volatile portSTACK_TYPE *pxCurrentTCB = 0;
88
static rt_thread_t cur_old = 0;
99
extern rt_thread_t rt_current_thread;
1010
static unsigned short mq_index = 0;
11+
static char mq_int_req = pdFALSE;
12+
static char mq_in_int = 0;
1113

1214
void 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
}
1630
void 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
}
2044
rt_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+
83125
signed 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
}
124150
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxTaskGetStackHighWaterMark( xTaskHandle xTask )
125151
{
@@ -142,6 +168,7 @@ void ICACHE_FLASH_ATTR vTaskDelay(portTickType xTicksToDelay) { rt_thread_delay(
142168
void ICACHE_FLASH_ATTR vTaskSuspendAll(void) { rt_enter_critical(); }
143169
signed portBASE_TYPE ICACHE_FLASH_ATTR xTaskResumeAll( void ) { rt_exit_critical();return pdTRUE; }
144170
portTickType ICACHE_FLASH_ATTR xTaskGetTickCount(void) { return rt_tick_get(); }
171+
void ICACHE_FLASH_ATTR vTaskSwitchContext(void) { rt_interrupt_enter();rt_schedule();rt_interrupt_leave(); }
145172
void ICACHE_FLASH_ATTR xPortSysTickHandle(void) { rt_interrupt_enter();rt_tick_increase();rt_interrupt_leave(); }
146173

147174
xQueueHandle 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 )
167194
signed 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
}
176210
signed 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
}
186231
signed 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
}
195243
signed 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

third_party/freertos/port.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
#include <xtensa/tie/xt_interrupt.h>
7272
#include <xtensa/tie/xt_timer.h>
7373

74+
//#define SHOW_DEBUG_INFO
75+
#include <rtthread.h>
76+
extern rt_thread_t rt_current_thread;
77+
7478
#include "freertos/FreeRTOS.h"
7579
#include "freertos/task.h"
7680
#include "freertos/xtensa_rtos.h"
@@ -201,6 +205,9 @@ void SoftIsrHdl(void *arg)
201205
{
202206
//if( DbgVal5==1 || DbgVal10==1 )
203207
//printf("_x_s,");
208+
#ifdef SHOW_DEBUG_INFO
209+
ets_printf("SwitchISR cur:%s %d:%d\n",rt_current_thread->name,SWReq,xHigherPriorityTaskWoken);
210+
#endif
204211
_xt_timer_int1();
205212
SWReq = 0;
206213
}

third_party/freertos/thread.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ rt_thread_t rt_thread_create(const char *name,
307307
if (thread == RT_NULL)
308308
return RT_NULL;
309309

310+
stack_size += 1024;
310311
stack_start = (void *)RT_KERNEL_MALLOC(stack_size);
311312
if (stack_start == RT_NULL)
312313
{

0 commit comments

Comments
 (0)