硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8979|回复: 12
收起左侧

[STM32H7] stm32H743 的FreeRTOS最多可以跑多少个线程、多少个优先级

[复制链接]

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2020-2-24 20:10:15 | 显示全部楼层 |阅读模式
stm32H743 的FreeRTOS最多可以跑多少个线程、多少个优先级,线程和优先级受什么限制?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-25 09:21:51 | 显示全部楼层
芯片容量够的话,不限制。
特别注意优先级设置,一般不推荐大于32


QQ截图20200225092348.png
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2020-2-26 16:36:41 | 显示全部楼层
eric2013 发表于 2020-2-25 09:21
芯片容量够的话,不限制。
特别注意优先级设置,一般不推荐大于32

谢谢 找到这个FreeRTOS文档了 ,那么之歌部分平台支持优先级算法优化的话 我怎么知道我用的H743支不支持 就是文档里说的要有平台架构有专用的汇编指令 这个指令我怎么去查?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-26 16:59:23 | 显示全部楼层
FLY 发表于 2020-2-26 16:36
谢谢 找到这个FreeRTOS文档了 ,那么之歌部分平台支持优先级算法优化的话 我怎么知道我用的H743支不支持  ...

M3,M4,M7都支持。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 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)

========================================================================

正常的堆栈使用情况: 127.png

harddefault的情况: 123.png     124.png       125.png     126.png

对比:
128.png

这是为啥会有harddefault?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-26 21:24:12 | 显示全部楼层
FLY 发表于 2020-2-26 20:14
使用FreeRTOS

#define configTOTAL_HEAP_SIZE   ( ( size_t ) ( 100 * 1024 ) )

没看懂你的问题,也没有看懂你要问什么。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2020-2-26 21:36:26 | 显示全部楼层
eric2013 发表于 2020-2-26 21:24
没看懂你的问题,也没有看懂你要问什么。

任务栈共100K,开启23个线程时,看到剩余栈大小51762字节,那为什么我再增加一个线程就发现进入harddefault了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-26 22:34:13 | 显示全部楼层
FLY 发表于 2020-2-26 21:36
任务栈共100K,开启23个线程时,看到剩余栈大小51762字节,那为什么我再增加一个线程就发现进入harddefau ...

你的任务怎么写的,仅写个deley大循环测试下看看。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2020-2-27 05:58:44 | 显示全部楼层
eric2013 发表于 2020-2-26 22:34
你的任务怎么写的,仅写个deley大循环测试下看看。

线程是这样的 ,给的任务栈2K

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);
        }
}
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2020-2-27 06:09:47 | 显示全部楼层
eric2013 发表于 2020-2-26 22:34
你的任务怎么写的,仅写个deley大循环测试下看看。

我把线程改成这样,还是不行

static void vTask_Test20(void *pvParameters)
{
        while(1)
        {               
                vTaskDelay(1);
        }
}


微信截图_20200227060432.png
错误在这
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-27 11:39:11 | 显示全部楼层
FLY 发表于 2020-2-27 06:09
我把线程改成这样,还是不行

static void vTask_Test20(void *pvParameters)

我创建了27个任务,没问题
QQ截图20200227113859.png

回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2020-2-29 11:47:33 | 显示全部楼层
eric2013 发表于 2020-2-27 11:39
我创建了27个任务,没问题

那就奇怪了 我是在V7的FreeTROS的模块上加的20 个任务啊,你创建的任务都是怎么写的?都是复制的vTaskStart这个任务的么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2020-2-29 12:28:06 | 显示全部楼层
FLY 发表于 2020-2-29 11:47
那就奇怪了 我是在V7的FreeTROS的模块上加的20 个任务啊,你创建的任务都是怎么写的?都是复制的vTaskSta ...

是的,复制后仅实现个delay即可,具体自己找找咋回事。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:01 , Processed in 0.048587 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表