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.

TMS320F28377S: 内置函数和内在函数有可重入性吗

Part Number: TMS320F28377S

Built-In Functions包括abs()  fabsf()  sqrt()

Intrinsics包括__sat()  __fsat()  __divf32()

这些函数有可重入性吗,比如在主循环执行__fsat()时,触发中断并在中断内执行__fsat() ,两次执行都会返回正确值吗

  • 您好:

    在讨论TMS320F28377S(一种TI的C2000系列DSP处理器)上的内置函数(Built-In Functions)和内在函数(Intrinsics)的可重入性时,我们需要理解几个关键点。

    内置函数(Built-In Functions)

    内置函数,如abs(), fabsf(), sqrt()等,在大多数编译器(包括用于TI DSP的编译器)中,都是设计为线程安全或可重入的,但这里的“线程”概念在嵌入式系统中可能不直接适用,因为嵌入式系统通常不运行多线程操作系统。然而,在中断上下文中,可重入性是一个重要的考虑因素。

    • 可重入性:这些内置函数通常不会使用静态或全局变量来存储中间结果,因此它们在中断服务例程(ISR)中被调用时,可以安全地与主循环或其他中断中的调用并行执行。即,在中断中调用这些函数时,它们应该能够返回正确的结果,前提是它们不依赖于被中断时主循环或其他中断可能修改的状态。

    内在函数(Intrinsics)

    内在函数,如__sat(), __fsat(), __divf32()等,是编译器提供的特殊函数,用于直接映射到硬件指令或实现特定的硬件加速功能。它们的可重入性取决于它们的具体实现和使用的资源。

    • 可重入性:对于大多数内在函数,特别是那些不涉及复杂状态管理或共享资源的函数(如__fsat()用于浮点数饱和),它们很可能是可重入的。然而,如果内在函数依赖于特定的硬件寄存器或资源,而这些资源可能在中断处理中被修改,则它们可能不是完全可重入的。

    注意事项

    • 硬件资源:在DSP中,某些操作(如除法)可能依赖于特定的硬件单元,这些单元可能在多个上下文中被共享。虽然编译器和硬件通常设计为在中断发生时正确处理这种情况,但在极端情况下,这可能会影响函数的可重入性。
    • 中断优先级:如果中断优先级设计得当,高优先级的中断可以打断低优先级的任务(包括主循环中的任务),而不会导致数据损坏或不一致。然而,这要求程序员仔细设计中断处理逻辑,以确保在中断服务例程中正确保护共享资源。

    结论

    在TMS320F28377S上,内置函数(如abs(), fabsf(), sqrt())和大多数内在函数(如__fsat())在大多数情况下都应该是可重入的,前提是它们不依赖于可能被中断修改的全局或静态状态。

  • 你好,请问能具体列明内置和内联函数中的哪些函数是不可重入的吗,如何确认是不是"依赖于特定的硬件寄存器或资源",因为其中很多都是使用FPU和TMU的,是否都是不可重入的。

    另外,28377S是有CLA的,如果和主核并行执行内置和内联函数,再加上中断,会有问题吗。

    再扩展下,如果是28377D再加上双核呢。

    以上不考虑中断嵌套的情况,启用FPU,TMU且函数可用。

    谢谢

  • 您好

    请问能具体列明内置和内联函数中的哪些函数是不可重入的吗,如何确认是不是"依赖于特定的硬件寄存器或资源",因为其中很多都是使用FPU和TMU的,是否都是不可重入的。

    无法具体跟您一一列明,如果对于这个不清楚的,请参考官方的TRM对于官方用的寄存器等都有详细说明:

    https://www.ti.com.cn/cn/lit/pdf/spruhx5

    这个链接是官方的TRM,

    另外,28377S是有CLA的,如果和主核并行执行内置和内联函数,再加上中断,会有问题吗。

    再扩展下,如果是28377D再加上双核呢。

    依据以上的回复中的说明,不依赖于特殊部分或硬件,以及不被全局占用或者是静态状态,应该没有问题,但是以上情况均使用于一般情况,在复杂情况下,需要考量实际运行状态而定。

  • 可重入性是一个基本的使用问题,ti的文档里没看到写各个内置和内联函数是否用了全局或者是静态变量,硬件资源是否支持上下文切换,这是ti要说明的,你发个28377s的文档没有用,起码要能指出spru430f或者spru513y哪个章节讲清楚了

    不能列明的话,举个例子什么情况不行也行,绕车轱辘话“依赖于特殊部分或硬件”能解决问题吗

  • 您好

    每个客户的情况不同,不能一一将相关内部函数做一一举例。

    简单来说(例子仅供理解):

    1、硬件部分以及内部特殊模块

    如果函数在使用中调用某个IO采集上来的数据或者是信号,当您重入时,由于硬件的IO已经被占用,导致了无法在同一个时间点上多进程进行占用导致出现问题。

    2、程序全局和静态变量

    这个设计到函数处理全局变量和静态变量,您多进程重入可能导致系统混乱。这个相对于1来说没有那么绝对,需要视函数和您的中断等程序而定。

    综上,涉及到可不可以重入,首先要取决于函数对于数据、变量、硬件以及模块的调用,其次还有取决于您的程序对于相关的函数处理。最后建议您参考TRM是熟悉函数对于调用的对象的理解,这样能帮助您进行分辨哪些可以重入。

  • 你好

    像下面这个回答说FPU库函数可重入,回答者检查了代码看全局变量和硬件寄存器

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/466825/c28x-fpu-library-and-reentrancy

    像下面这个回答说 DELAY_US 调用ACC就不可重入

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/771994/compiler-tms320f28035-is-delay_us-reentrant

    我想要的是这样的回复,确认内置和内在函数本身是否有可重入性,跟我的程序如何使用应该没有关系

  • 您好

    您提到的两个帖子均是用我之前的方法来确认的,证明我给您的说明没有问题。

    我想要的是这样的回复,确认内置和内在函数本身是否有可重入性,跟我的程序如何使用应该没有关系

    根据您分享的帖子都是库中部分函数,您问的是两个类型,TI这个IC的内部函数。官方没有全部准确的相关文档。针对您分享的帖子,您也看到了也是基于全局和静态变量以及结合测试来判断的。如果就您之前举例的__fsat()是可以的。

    综上,如果您想知道您目标的函数可不可以,可以通过之前回复的判断方式来进行判断(结合TRM、源码和测试——您推荐的帖子也是用了这种方法)。如果您想问例子中的__fsat()可不可以,回复是可以的。