野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 198|回复: 4

FreeRTOS新手求助

[复制链接]
发表于 2024-5-22 03:10:43 | 显示全部楼层 |阅读模式
本帖最后由 微信用户-Zr9DCi 于 2024-5-22 03:11 编辑

最近在学习FreeRTOS,有一个疑问在portmacro.h中调用了FreeRTOSConfig.h的宏定义configMAX_SYSCALL_INTERRUPT_PRIORITY,但是portmacro.h却没有#include“FreeRTOSConfig.h”,为什么还是可以运行成功呢?
  1. #ifndef PORTMACRO_H
  2. #define PORTMACRO_H

  3. #include "stdint.h"
  4. #include "stddef.h"

  5. /* 数据类型重定义 */
  6. #define portCHAR                char
  7. #define portFLOAT                float
  8. #define portDOUBLE                double
  9. #define portLONG                long
  10. #define portSHORT                short
  11. #define portSTACK_TYPE        uint32_t
  12. #define portBASE_TYPE        long

  13. typedef portSTACK_TYPE StackType_t;
  14. typedef long BaseType_t;
  15. typedef unsigned long UBaseType_t;

  16. #if( configUSE_16_BIT_TICKS == 1 )
  17.         typedef uint16_t TickType_t;
  18.         #define portMAX_DELAY ( TickType_t ) 0xffff
  19. #else
  20.         typedef uint32_t TickType_t;
  21.         #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
  22. #endif



  23. /* 中断控制状态寄存器:0xe000ed04
  24. * Bit 28 PENDSVSET: PendSV 悬起位
  25. */
  26. #define portNVIC_INT_CTRL_REG                ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
  27. #define portNVIC_PENDSVSET_BIT                ( 1UL << 28UL )

  28. #define portSY_FULL_READ_WRITE                ( 15 )



  29. #define portYIELD()                                  \
  30. {                                                    \
  31.   /* 触发PendSV,产生上下文切换 */                   \
  32.         portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;    \
  33.         __dsb( portSY_FULL_READ_WRITE );                   \
  34.         __isb( portSY_FULL_READ_WRITE );                   \
  35. }



  36. /* 临界区管理 */
  37. #define portDISABLE_INTERRUPTS()                                    vPortRaiseBASEPRI()
  38. #define portSET_INTERRUPT_MASK_FROM_ISR()   ulPortRaiseBASEPRI()



  39. #ifndef portFORCE_INLINE
  40.         #define portFORCE_INLINE __forceinline
  41. #endif

  42. /*-----------------------------------------------------------*/
  43. /* 不带返回值的关中断函数,不能嵌套,不能在中断里面使用 */
  44. static portFORCE_INLINE void vPortRaiseBASEPRI( void )
  45. {
  46. uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

  47.         __asm
  48.         {
  49.                 /* Set BASEPRI to the max syscall priority to effect a critical
  50.                 section. */
  51.                 msr basepri, ulNewBASEPRI
  52.                 dsb
  53.                 isb
  54.         }
  55. }

  56. /*-----------------------------------------------------------*/
  57. /* 带返回值的关中断函数,可以嵌套,可以在中断里面使用 */
  58. static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
  59. {
  60.         uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

  61.         __asm
  62.         {
  63.                 /* Set BASEPRI to the max syscall priority to effect a critical
  64.                 section. */
  65.                 mrs ulReturn, basepri
  66.                 msr basepri, ulNewBASEPRI
  67.                 dsb
  68.                 isb
  69.         }

  70.         return ulReturn;
  71. }








  72. #endif /* PORTMACRO_H */

复制代码

野火论坛202405220310117305..png
回复

使用道具 举报

发表于 2024-5-22 11:15:59 | 显示全部楼层
portmacro.h 中引用了两个头文件,在这两个头文件中有吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-22 15:36:01 | 显示全部楼层
Nalimca 发表于 2024-5-22 11:15
portmacro.h 中引用了两个头文件,在这两个头文件中有吗?

#include "stdint.h"
#include "stddef.h"
这两个文件不都是C标准库吗?应该与FreeRTOS无关吧
回复 支持 反对

使用道具 举报

发表于 2024-5-23 18:04:03 | 显示全部楼层
可能这是一个inline函数,编译器不会在定义处编译,而是在调用的地方,将函数在此处展开,之后在进行编译,所以应该是在调用这个inline函数的.c文件引用了FreeRTOSConfig.h.
我个人想法供您参考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-24 14:34:52 | 显示全部楼层
Nalimca 发表于 2024-5-23 18:04
可能这是一个inline函数,编译器不会在定义处编译,而是在调用的地方,将函数在此处展开,之后在进行编译,所以 ...

有一定道理!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-14 21:05 , Processed in 0.161352 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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