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

Skip to content

Commit 1d6c103

Browse files
修正一些bug
1 parent e7ab1ec commit 1d6c103

File tree

2 files changed

+118
-47
lines changed

2 files changed

+118
-47
lines changed

third_party/freertos/include/rtconfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@
5555
/* Using Dynamic Heap Management */
5656
#define RT_USING_HEAP
5757

58+
#define WDEV_NOW() REG_READ(0x3ff20c00)
59+
#define ShowInfo(s,d) {ets_printf("n:%s t:%d\n",s,WDEV_NOW()); if(d) ets_delay_us(d);}
60+
#define IDLE_THREAD_STACK_SIZE 512
61+
5862
#endif

third_party/freertos/libcpu.c

Lines changed: 114 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
#include <string.h>
44
#include <rtthread.h>
55

6+
#define SHOW_DEBUG_INFO
67
volatile portSTACK_TYPE *pxCurrentTCB = 0;
8+
static rt_thread_t cur_old = 0;
9+
extern rt_thread_t rt_current_thread;
10+
static unsigned short mq_index = 0;
11+
712
void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to)
813
{
914
PendSV(1);
@@ -78,88 +83,150 @@ void ICACHE_FLASH_ATTR rtthread_startup(void)
7883
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 )
7984
{
8085
signed portBASE_TYPE xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
81-
rt_thread_t thread = *pxCreatedTask = rt_thread_create(pcName,pxTaskCode,pvParameters,usStackDepth,20-uxPriority,10);
86+
rt_thread_t thread = *pxCreatedTask = rt_thread_create(pcName,pxTaskCode,pvParameters,usStackDepth+4096,20-uxPriority,10);
8287
if (*pxCreatedTask != 0)
8388
{
89+
#ifdef SHOW_DEBUG_INFO
90+
ets_printf("TaskCreate name:%s pri:%d size:%d\n",pcName,(20-uxPriority),(usStackDepth+4096));
91+
#endif
8492
rt_thread_startup(*pxCreatedTask);
8593
xReturn = pdPASS;
8694
}
8795
return xReturn;
8896
}
89-
90-
void ICACHE_FLASH_ATTR vTaskStartScheduler(void) { xPortStartScheduler(); }
91-
void ICACHE_FLASH_ATTR vTaskDelete(xTaskHandle xTaskToDelete) { ets_printf("%s\n",__func__);/*rt_thread_delete(xTaskToDelete);*/ }
92-
void ICACHE_FLASH_ATTR vTaskDelay(portTickType xTicksToDelay) { rt_thread_delay(xTicksToDelay); }
93-
void ICACHE_FLASH_ATTR vTaskSuspendAll(void) { rt_enter_critical(); }
94-
signed portBASE_TYPE ICACHE_FLASH_ATTR xTaskResumeAll( void ) { rt_exit_critical();return pdTRUE; }
95-
void ICACHE_FLASH_ATTR vTaskSwitchContext(void) { rt_interrupt_enter();rt_schedule();rt_interrupt_leave(); }
96-
portTickType ICACHE_FLASH_ATTR xTaskGetTickCount(void) { return rt_tick_get(); }
97-
void ICACHE_FLASH_ATTR xPortSysTickHandle(void) { rt_interrupt_enter();rt_tick_increase();rt_interrupt_leave(); }
98-
99-
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxTaskGetStackHighWaterMark( xTaskHandle xTask )
97+
void ICACHE_FLASH_ATTR vTaskDelete(xTaskHandle xTaskToDelete)
10098
{
101-
ets_printf("uxTaskGetStackHighWaterMark\n");
102-
return 0;
99+
rt_thread_t thread = xTaskToDelete;
100+
if (xTaskToDelete == 0)
101+
thread = rt_current_thread;
102+
#ifdef SHOW_DEBUG_INFO
103+
ets_printf("TaskDelete name:%s\n",thread->name);
104+
#endif
105+
rt_thread_suspend(thread);
103106
}
104-
void ICACHE_FLASH_ATTR vTaskStepTick(portTickType xTicksToJump)
107+
void ICACHE_FLASH_ATTR vTaskSwitchContext(void)
105108
{
106-
ets_printf("vTaskStepTick\n");
109+
rt_interrupt_enter();
110+
cur_old = rt_current_thread;
111+
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();
107123
}
108-
portTickType ICACHE_FLASH_ATTR prvGetExpectedIdleTime(void)
124+
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxTaskGetStackHighWaterMark( xTaskHandle xTask )
109125
{
110-
ets_printf("prvGetExpectedIdleTime\n");
111-
return 0;
126+
register unsigned short usCount = 0U;
127+
rt_thread_t thread = xTask;
128+
if (xTask == 0)
129+
thread = rt_current_thread;
130+
rt_uint8_t *ptr = (rt_uint8_t *)thread->stack_addr;
131+
while (*ptr == '#')
132+
{
133+
usCount ++;
134+
ptr ++;
135+
}
136+
usCount /= sizeof( portSTACK_TYPE );
137+
return usCount;
112138
}
113139

114-
xTimerHandle ICACHE_FLASH_ATTR xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction )
115-
{
116-
ets_printf("xTimerCreate\n");
117-
return 0;
118-
}
119-
portBASE_TYPE ICACHE_FLASH_ATTR xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime )
120-
{
121-
ets_printf("xTimerGenericCommand\n");
122-
return 0;
123-
}
140+
void ICACHE_FLASH_ATTR vTaskStartScheduler(void) { xPortStartScheduler(); }
141+
void ICACHE_FLASH_ATTR vTaskDelay(portTickType xTicksToDelay) { rt_thread_delay(xTicksToDelay); }
142+
void ICACHE_FLASH_ATTR vTaskSuspendAll(void) { rt_enter_critical(); }
143+
signed portBASE_TYPE ICACHE_FLASH_ATTR xTaskResumeAll( void ) { rt_exit_critical();return pdTRUE; }
144+
portTickType ICACHE_FLASH_ATTR xTaskGetTickCount(void) { return rt_tick_get(); }
145+
void ICACHE_FLASH_ATTR xPortSysTickHandle(void) { rt_interrupt_enter();rt_tick_increase();rt_interrupt_leave(); }
124146

125147
xQueueHandle ICACHE_FLASH_ATTR xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType )
126148
{
127-
ets_printf("xQueueGenericCreate\n");
128-
return malloc(100);
149+
char name[10];
150+
sprintf(name,"q%02d",((++mq_index)%100));
151+
rt_mq_t mq = rt_mq_create(name,uxItemSize,uxQueueLength,RT_IPC_FLAG_FIFO);
152+
#ifdef SHOW_DEBUG_INFO
153+
if (mq)
154+
ets_printf("QueueCreate name:%s count:%d size:%d\n",name,uxQueueLength,uxItemSize);
155+
#endif
156+
return mq;
129157
}
130158
void ICACHE_FLASH_ATTR vQueueDelete( xQueueHandle xQueue )
131159
{
132-
ets_printf("vQueueDelete\n");
160+
rt_mq_t mq = xQueue;
161+
#ifdef SHOW_DEBUG_INFO
162+
if (mq)
163+
ets_printf("QueueDelete name:%s\n",mq->parent.parent.name);
164+
#endif
165+
rt_mq_delete(mq);
133166
}
134167
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition )
135168
{
136-
ets_printf("xQueueGenericSend\n");
137-
return pdPASS;
169+
rt_mq_t mq = xQueue;
170+
rt_err_t err = rt_mq_send(mq,(void *)pvItemToQueue,mq->msg_size);
171+
#ifdef SHOW_DEBUG_INFO
172+
ets_printf("QueueSend name:%s wait:%d pos:%d ret:%d\n",mq->parent.parent.name,xTicksToWait,xCopyPosition,err);
173+
#endif
174+
return (err==RT_EOK)?pdPASS:errQUEUE_FULL;
138175
}
139-
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericReceive( xQueueHandle xQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking )
176+
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition )
140177
{
141-
ets_printf("xQueueGenericReceive\n");
142-
return pdPASS;
178+
rt_mq_t mq = xQueue;
179+
rt_err_t err = rt_mq_send(mq,(void *)pvItemToQueue,mq->msg_size);
180+
#ifdef SHOW_DEBUG_INFO
181+
ets_printf("QueueSendISR name:%s pos:%d ret:%d\n",mq->parent.parent.name,xCopyPosition,err);
182+
#endif
183+
if (pxHigherPriorityTaskWoken) *pxHigherPriorityTaskWoken = pdFALSE;
184+
return (err==RT_EOK)?pdPASS:errQUEUE_FULL;
143185
}
144-
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition )
186+
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueGenericReceive( xQueueHandle xQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking )
145187
{
146-
return pdPASS;
188+
rt_mq_t mq = xQueue;
189+
rt_err_t err = rt_mq_recv(mq,(void *)pvBuffer,mq->msg_size,xTicksToWait);
190+
#ifdef SHOW_DEBUG_INFO
191+
ets_printf("QueueRecv name:%s wait:%d peek:%d ret:%d\n",mq->parent.parent.name,xTicksToWait,xJustPeeking,err);
192+
#endif
193+
return (err==RT_EOK)?pdPASS:errQUEUE_EMPTY;
147194
}
148195
signed portBASE_TYPE ICACHE_FLASH_ATTR xQueueReceiveFromISR( xQueueHandle xQueue, const void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken )
149196
{
150-
ets_printf("xQueueReceiveFromISR\n");
151-
return pdPASS;
197+
rt_mq_t mq = xQueue;
198+
rt_err_t err = rt_mq_recv(mq,(void *)pvBuffer,mq->msg_size,0);
199+
#ifdef SHOW_DEBUG_INFO
200+
ets_printf("QueueRecvISR name:%s ret:%d\n",mq->parent.parent.name,err);
201+
#endif
202+
if (pxHigherPriorityTaskWoken) *pxHigherPriorityTaskWoken = pdFALSE;
203+
return (err==RT_EOK)?pdPASS:errQUEUE_EMPTY;
152204
}
153-
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue )
205+
206+
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxQueueMessagesWaitingFromISR(const xQueueHandle xQueue) { rt_mq_t mq = xQueue; return mq->entry; }
207+
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxQueueMessagesWaiting(const xQueueHandle xQueue) { rt_mq_t mq = xQueue; return mq->entry; }
208+
209+
xTimerHandle ICACHE_FLASH_ATTR xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction )
210+
{
211+
ets_printf("xTimerCreate Failed!\n");
212+
return 0;
213+
}
214+
portBASE_TYPE ICACHE_FLASH_ATTR xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime )
215+
{
216+
ets_printf("xTimerGenericCommand Failed!\n");
217+
return pdFAIL;
218+
}
219+
220+
void ICACHE_FLASH_ATTR vTaskStepTick(portTickType xTicksToJump)
154221
{
155-
ets_printf("uxQueueMessagesWaitingFromISR\n");
156-
return pdPASS;
222+
ets_printf("vTaskStepTick Failed!\n");
157223
}
158-
unsigned portBASE_TYPE ICACHE_FLASH_ATTR uxQueueMessagesWaiting( const xQueueHandle xQueue )
224+
portTickType ICACHE_FLASH_ATTR prvGetExpectedIdleTime(void)
159225
{
160-
ets_printf("uxQueueMessagesWaiting\n");
161-
return pdPASS;
226+
ets_printf("prvGetExpectedIdleTime Failed!\n");
227+
return 0;
162228
}
229+
163230
xQueueHandle ICACHE_FLASH_ATTR xQueueCreateMutex( unsigned char ucQueueType )
164231
{
165232
ets_printf("xQueueCreateMutex Failed!\n");

0 commit comments

Comments
 (0)