硬汉嵌入式论坛

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

[RL-RTX] 如果不使用微库,使用C标准库的话,RTX5会在堆栈初始化阶段就开启了

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2019-8-17 00:30:48 | 显示全部楼层 |阅读模式
QQ截图20190817001918.jpg


通过C库的API也会使用互斥信号量等:

  1. // C/C++ Standard Library Multithreading Interface
  2. // ===============================================

  3. #if ( !defined(RTX_NO_MULTITHREAD_CLIB) && \
  4.      ( defined(__CC_ARM) || \
  5.       (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))) && \
  6.       !defined(__MICROLIB))

  7. #define LIBSPACE_SIZE 96

  8. //lint -esym(714,__user_perthread_libspace,_mutex_*) "Referenced by C library"
  9. //lint -esym(765,__user_perthread_libspace,_mutex_*) "Global scope"
  10. //lint -esym(9003, os_libspace*) "variables 'os_libspace*' defined at module scope"

  11. // Memory for libspace
  12. static uint32_t os_libspace[OS_THREAD_LIBSPACE_NUM+1][LIBSPACE_SIZE/4] \
  13. __attribute__((section(".bss.os.libspace")));

  14. // Thread IDs for libspace
  15. static osThreadId_t os_libspace_id[OS_THREAD_LIBSPACE_NUM] \
  16. __attribute__((section(".bss.os.libspace")));

  17. // Check if Kernel has been started
  18. static uint32_t os_kernel_is_active (void) {
  19.   static uint8_t os_kernel_active = 0U;

  20.   if (os_kernel_active == 0U) {
  21.     if (osKernelGetState() > osKernelReady) {
  22.       os_kernel_active = 1U;
  23.     }
  24.   }
  25.   return (uint32_t)os_kernel_active;
  26. }

  27. // Provide libspace for current thread
  28. void *__user_perthread_libspace (void);
  29. void *__user_perthread_libspace (void) {
  30.   osThreadId_t id;
  31.   uint32_t     n;

  32.   if (os_kernel_is_active() != 0U) {
  33.     id = osThreadGetId();
  34.     for (n = 0U; n < (uint32_t)OS_THREAD_LIBSPACE_NUM; n++) {
  35.       if (os_libspace_id[n] == NULL) {
  36.         os_libspace_id[n] = id;
  37.       }
  38.       if (os_libspace_id[n] == id) {
  39.         break;
  40.       }
  41.     }
  42.     if (n == (uint32_t)OS_THREAD_LIBSPACE_NUM) {
  43.       (void)osRtxErrorNotify(osRtxErrorClibSpace, id);
  44.     }
  45.   } else {
  46.     n = OS_THREAD_LIBSPACE_NUM;
  47.   }

  48.   //lint -e{9087} "cast between pointers to different object types"
  49.   return (void *)&os_libspace[n][0];
  50. }

  51. // Mutex identifier
  52. typedef void *mutex;

  53. //lint -save "Function prototypes defined in C library"
  54. //lint -e970 "Use of 'int' outside of a typedef"
  55. //lint -e818 "Pointer 'm' could be declared as pointing to const"

  56. // Initialize mutex
  57. __USED
  58. int _mutex_initialize(mutex *m);
  59. int _mutex_initialize(mutex *m) {
  60.   int result;

  61.   *m = osMutexNew(NULL);
  62.   if (*m != NULL) {
  63.     result = 1;
  64.   } else {
  65.     result = 0;
  66.     (void)osRtxErrorNotify(osRtxErrorClibMutex, m);
  67.   }
  68.   return result;
  69. }

  70. // Acquire mutex
  71. __USED
  72. void _mutex_acquire(mutex *m);
  73. void _mutex_acquire(mutex *m) {
  74.   if (os_kernel_is_active() != 0U) {
  75.     (void)osMutexAcquire(*m, osWaitForever);
  76.   }
  77. }

  78. // Release mutex
  79. __USED
  80. void _mutex_release(mutex *m);
  81. void _mutex_release(mutex *m) {
  82.   if (os_kernel_is_active() != 0U) {
  83.     (void)osMutexRelease(*m);
  84.   }
  85. }

  86. // Free mutex
  87. __USED
  88. void _mutex_free(mutex *m);
  89. void _mutex_free(mutex *m) {
  90.   (void)osMutexDelete(*m);
  91. }

  92. //lint -restore

  93. #endif
复制代码


回复

使用道具 举报

3

主题

1223

回帖

1232

积分

至尊会员

积分
1232
发表于 2019-8-17 11:23:23 | 显示全部楼层
硬汉大哥, 不使用微库,实用标准库,  对RTX5来说有什么影响没有 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-8-17 12:55:41 | 显示全部楼层
morning_enr6U 发表于 2019-8-17 11:23
硬汉大哥, 不使用微库,实用标准库,  对RTX5来说有什么影响没有 ?

对RTX5没有影响。那个FlasFS要用C标准库
回复

使用道具 举报

3

主题

1223

回帖

1232

积分

至尊会员

积分
1232
发表于 2019-8-17 20:37:46 | 显示全部楼层
感谢,硬汉的解答,谢谢!
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2023-10-15 21:46:16 | 显示全部楼层
跑rtos2 的 CMSIS_5-5.9.0\CMSIS\RTOS2\RTX\Examples\Blinky
1. 用c库,调试可以跑起来;直接下到板子上,就卡死了
2. 用microlib,调试和下到板子都正常
不知道是怎么回事?
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2023-10-16 00:01:43 | 显示全部楼层
cdmar79 发表于 2023-10-15 21:46
跑rtos2 的 CMSIS_5-5.9.0\CMSIS\RTOS2\RTX\Examples\Blinky
1. 用c库,调试可以跑起来;直接下到板子上, ...

发现是c库模式,下到板子后,printf函数失效,没打印东西,以为卡死了
但是很奇怪,单步调试可以打印的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2023-10-16 07:35:06 | 显示全部楼层
cdmar79 发表于 2023-10-15 21:46
跑rtos2 的 CMSIS_5-5.9.0\CMSIS\RTOS2\RTX\Examples\Blinky
1. 用c库,调试可以跑起来;直接下到板子上, ...

此贴方法解决即可。

使用MDK RTE可以方便的随意切换微库和C标准库
https://www.armbbs.cn/forum.php? ... 0641&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2023-10-16 12:15:29 | 显示全部楼层
eric2013 发表于 2023-10-16 07:35
此贴方法解决即可。

使用MDK RTE可以方便的随意切换微库和C标准库

可以解决

另有一问,是否有运行时计算当前程序体(flash)文件大小的办法(也就是静态的bin文件大小,怎么在运行时可以算出/获取到)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2023-10-17 10:19:27 | 显示全部楼层
cdmar79 发表于 2023-10-16 12:15
可以解决

另有一问,是否有运行时计算当前程序体(flash)文件大小的办法(也就是静态的bin ...

MDK编程完成后,批处理自动计算是否满足需求。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 23:09 , Processed in 0.283805 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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