为什么ThreadX的入口函数使用ULONG作为入口输入而不是void*?

问题描述 投票:0回答:1
UINT tx_thread_create(TX_THREAD *thread_ptr, CHAR *name_ptr, 
                      VOID (*entry_function)(ULONG), ULONG entry_input, 
                      VOID *stack_start, ULONG stack_size, UINT priority,
                      UINT preempt_threshold, ULONG time_slice, 
                      UINT auto_start)

文档:
tx_thread_create documentation

如果我需要向

entry_function
传递多个参数,我必须使用
void *
,因此我的问题是,为什么 ThreadX 使用
ULONG
而不是像 FreeRTOS 那样使用
void *

c freertos rtos threadx azure-rtos
1个回答
0
投票

可以根据需要重新解释该论证。 严格来说,参数类型最好是

uintptr_t
,即能够保存指针类型的无符号整数类型,但这也可能是
unsigned long
的类型别名,所以实际上它没有区别。

如果它被设为

void*
但您想传递一个整数值,则在许多情况下它会包含一个不是有效指针的值,而任何
ULONG
值都是有效的。

为了实现您的目标,考虑到:

typedef struct
{
    ...
} tThreadInfo ;


void threadMainXxxx( tThreadInfo* arg )
{
    for{;;}
    {
        ...
    }
}

VOID threadEntryXxxx( ULONG arg )
{
    threadMainXxxx( (tThreadInfo)arg ) ;
}

然后您可以开始您的线程(省略细节

...
):

static tThreadInfo thread_arg = {...} ;

UINT status = tx_thread_create( &xxxx_tcb, "XXXX", 
                                threadEntryXxxx, (ULONG)&thread_arg, 
                                ...) ;
© www.soinside.com 2019 - 2024. All rights reserved.