Built-In Functions包括abs() fabsf() sqrt()
Intrinsics包括__sat() __fsat() __divf32()
这些函数有可重入性吗,比如在主循环执行__fsat()时,触发中断并在中断内执行__fsat() ,两次执行都会返回正确值吗
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Built-In Functions包括abs() fabsf() sqrt()
Intrinsics包括__sat() __fsat() __divf32()
这些函数有可重入性吗,比如在主循环执行__fsat()时,触发中断并在中断内执行__fsat() ,两次执行都会返回正确值吗
您好:
在讨论TMS320F28377S(一种TI的C2000系列DSP处理器)上的内置函数(Built-In Functions)和内在函数(Intrinsics)的可重入性时,我们需要理解几个关键点。
内置函数,如abs()
, fabsf()
, sqrt()
等,在大多数编译器(包括用于TI DSP的编译器)中,都是设计为线程安全或可重入的,但这里的“线程”概念在嵌入式系统中可能不直接适用,因为嵌入式系统通常不运行多线程操作系统。然而,在中断上下文中,可重入性是一个重要的考虑因素。
内在函数,如__sat()
, __fsat()
, __divf32()
等,是编译器提供的特殊函数,用于直接映射到硬件指令或实现特定的硬件加速功能。它们的可重入性取决于它们的具体实现和使用的资源。
__fsat()
用于浮点数饱和),它们很可能是可重入的。然而,如果内在函数依赖于特定的硬件寄存器或资源,而这些资源可能在中断处理中被修改,则它们可能不是完全可重入的。在TMS320F28377S上,内置函数(如abs()
, fabsf()
, sqrt()
)和大多数内在函数(如__fsat()
)在大多数情况下都应该是可重入的,前提是它们不依赖于可能被中断修改的全局或静态状态。
您好
请问能具体列明内置和内联函数中的哪些函数是不可重入的吗,如何确认是不是"依赖于特定的硬件寄存器或资源",因为其中很多都是使用FPU和TMU的,是否都是不可重入的。
无法具体跟您一一列明,如果对于这个不清楚的,请参考官方的TRM对于官方用的寄存器等都有详细说明:
https://www.ti.com.cn/cn/lit/pdf/spruhx5
这个链接是官方的TRM,
另外,28377S是有CLA的,如果和主核并行执行内置和内联函数,再加上中断,会有问题吗。
再扩展下,如果是28377D再加上双核呢。
依据以上的回复中的说明,不依赖于特殊部分或硬件,以及不被全局占用或者是静态状态,应该没有问题,但是以上情况均使用于一般情况,在复杂情况下,需要考量实际运行状态而定。
您好
每个客户的情况不同,不能一一将相关内部函数做一一举例。
简单来说(例子仅供理解):
1、硬件部分以及内部特殊模块
如果函数在使用中调用某个IO采集上来的数据或者是信号,当您重入时,由于硬件的IO已经被占用,导致了无法在同一个时间点上多进程进行占用导致出现问题。
2、程序全局和静态变量
这个设计到函数处理全局变量和静态变量,您多进程重入可能导致系统混乱。这个相对于1来说没有那么绝对,需要视函数和您的中断等程序而定。
综上,涉及到可不可以重入,首先要取决于函数对于数据、变量、硬件以及模块的调用,其次还有取决于您的程序对于相关的函数处理。最后建议您参考TRM是熟悉函数对于调用的对象的理解,这样能帮助您进行分辨哪些可以重入。
你好
像下面这个回答说FPU库函数可重入,回答者检查了代码看全局变量和硬件寄存器
像下面这个回答说 DELAY_US 调用ACC就不可重入
我想要的是这样的回复,确认内置和内在函数本身是否有可重入性,跟我的程序如何使用应该没有关系
您好
像下面这个回答说FPU库函数可重入,回答者检查了代码看全局变量和硬件寄存器
像下面这个回答说 DELAY_US 调用ACC就不可重入
您提到的两个帖子均是用我之前的方法来确认的,证明我给您的说明没有问题。
我想要的是这样的回复,确认内置和内在函数本身是否有可重入性,跟我的程序如何使用应该没有关系
根据您分享的帖子都是库中部分函数,您问的是两个类型,TI这个IC的内部函数。官方没有全部准确的相关文档。针对您分享的帖子,您也看到了也是基于全局和静态变量以及结合测试来判断的。如果就您之前举例的__fsat()是可以的。
综上,如果您想知道您目标的函数可不可以,可以通过之前回复的判断方式来进行判断(结合TRM、源码和测试——您推荐的帖子也是用了这种方法)。如果您想问例子中的__fsat()可不可以,回复是可以的。