|

楼主 |
发表于 2020-2-26 20:14:08
|
显示全部楼层
使用FreeRTOS
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 100 * 1024 ) )
Stack_Size EQU 0x00003000
Heap_Size EQU 0x00002000
现在我堆栈是这样的。
实验一:正常
开启了23个线程,每个线程给2k栈空间,其中有19个线程有个 pcWriteBuffer[500]的数组,有个malloc(128),这时程序可以正常运行。
线程代码如下:
static void vTask_Test28(void *pvParameters)
{
char *str=NULL;
float V = 0.1,T = 0.2,X = 0;
double r = 0.1,S = 0;
static uint32_t cou28 = 0;
uint16_t len=0;
uint8_t pcWriteBuffer[500];
while(1)
{
xSemaphoreTake(MutexSemaphore, portMAX_DELAY);
printf("==================vTask_Test28=====================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
//printf("\r\n任务名 运行计数 使用率\r\n");
//vTaskGetRunTimeStats((char *)&pcWriteBuffer);
//printf("%s\r\n", pcWriteBuffer);
printf("当前动态内存剩余大小 = %d字节\r\n", xPortGetFreeHeapSize());
cou28 = Tst_Counter(cou28);
str = malloc(128);
printf("申请动态内存后剩余大小 = %d字节\r\n", xPortGetFreeHeapSize());
V = (V + (g_Nn++) % 128);
T = (T + (g_Mm++) % 128);
r = (r + (g_Kk++) % 128);
X = V*T;
S = PI * pow(r,2);
sprintf(str,"%s%0.2f%s%0.2f%s%d%s","vTaskTest28----the X is ",X," ****the S is ",S," cou:",cou28," ++++0022\r\n");
len = strlen(str);
printf("%s",str);
// //printf("%s","\r\nvTaskTest2--------------------------\r\n");
//Tst_Print(str,len);
free(str);
printf("释放申请的动态内存后大小 = %d字节\r\n", xPortGetFreeHeapSize());
xSemaphoreGive(MutexSemaphore);
vTaskDelay(1);
}
}
htm 里是这样的:Maximum Stack Usage = 784 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
map 里是这样的:
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
2696 364 144 0 0 1404 m_wv.l
3024 138 0 16 0 1588 mc_w.l
1112 0 0 0 0 736 mf_w.l
----------------------------------------------------------------------
6838 502 144 16 0 3728 Library Totals
----------------------------------------------------------------------
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
41072 9014 944 376 128200 2707821 Grand Totals
41072 9014 944 16 128200 2707821 ELF Image Totals (compressed)
41072 9014 944 16 0 0 ROM Totals
==============================================================================
实验二:harddefault
开启了24个线程,每个线程给2k栈空间,其中有20个线程有个 pcWriteBuffer[500]的数组,有个malloc(128),这时程序可以正常运行。
线程代码如下:同实验一
htm 里是这样的:Maximum Stack Usage = 784 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
map 里是这样的:
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
2696 364 144 0 0 1404 m_wv.l
3024 138 0 16 0 1588 mc_w.l
1112 0 0 0 0 736 mf_w.l
----------------------------------------------------------------------
6838 502 144 16 0 3728 Library Totals
----------------------------------------------------------------------
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
41732 9370 948 384 128200 2708501 Grand Totals
41732 9370 948 16 128200 2708501 ELF Image Totals (compressed)
41732 9370 948 16 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 42680 ( 41.68kB)
Total RW Size (RW Data + ZI Data) 128584 ( 125.57kB)
Total ROM Size (Code + RO Data + RW Data) 42696 ( 41.70kB)
========================================================================
正常的堆栈使用情况:
harddefault的情况:
对比:
这是为啥会有harddefault? |
|