TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2340R5: sem_wait的tick單位

Part Number:CC2340R5Other Parts Discussed in Thread:CC2640

想問一下 我想讓sem_wait()等待30ms之後就跳出來 我該怎麼設定?
我看了一下原本是semaphorePend(obj->sem, portMAX_DELAY);
#define portMAX_DELAY 0xffffffffUL
這是以 System Clock 1/48M 去算的嗎?

Yolande Wang:

Ryan 说:我想讓sem_wait()等待30ms之後就跳出來 我該怎麼設定?

sem_wait() 函数控制着信号量的值。

函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。

Ryan 说:semaphorePend(obj->sem, portMAX_DELAY);

https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/sysbios/6_52_00_12/exports/bios_6_52_00_12/docs/cdoc/ti/sysbios/knl/Semaphore.html

https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/6.20.00.29/exports/docs/tirtos7/doxygen/m4/html/Semaphore_8h.html#ac7e0b45f15b2f6f5a7e4ecc772ddbd0c

Ryan 说:#define portMAX_DELAY 0xffffffffUL

#define portMAX_DELAY 0xffffffffUL 宏定义,在 FreeRTOS 中用于表示无限超时或最长等待时间。

这个定义本身并不是基于任何特定的时钟速率(如48MHz)计算的,而是表示一个特定的值,通常是最大的无符号长整数(unsigned long),即 32 位全 1 的二进制数。

https://techoverflow.net/2022/01/07/how-long-does-portmax_delay-actually-wait-in-freertos/

,

Yolande Wang:

您好,

可以将 sem_waite 替换为 sem_timedwait。

sem_timedwait() API 仅在达到指定的时间或信号量变为可用(以先发生的时间为准)之前阻止。

请参阅:

http://software-dl.ti.com/ecs/SIMPLELINK_CC32XX_SDK/3_40_00_05/exports/docs/simplelink_mcu_sdk/SimpleLink_Gen1_to_Gen2_SDK_Migration_Guide.html#semaphores

,

Ryan:

那麼int sem_timedwait(sem_t *semaphore, const struct timespec *abstime)的struct timespec avstime的單位是甚麼ms還是ns? 或是說他只是一個count 要自己用1/48M 去換算?

,

Yolande Wang:

 tv_sec;表示秒数
tv_nsec;表示额外的纳秒数

这是一个 struct timespe 的定义示例:

使用 sem_timedwait 函数时,需要提供 struct timespe 结构体。 这个时间点是你想让等待操作超时的绝对时间。如果信号量在这个时间之前变得可用,函数将返回成功;反之,函数因超时而返回。 因此,您不需要基于系统时钟频率来计算这个时间。 如果您想让 sem_timedwait 在30 毫秒后超时,你可以计算从当前时间起 30 毫秒后的时间点,将之设置为 sem_timedwait 的 abstime 参数。


,

Ryan:

意思是說 我可能需要用到RTC去讀取Count 轉換成 Second之後 再去計算30秒後時間是多少 再代入sem_timedwait 嗎

,

Yolande Wang:

是的,您的理解是正确的。

sem_timedwait 函数在未来确切时间点超时。

这种方式在进行同步操作或需要在特定时间内等待资源时非常有用。

,

Ryan:

了解 這樣我懂了 謝謝!

,

Yolande Wang:

不客气!

,

Ryan:

能夠請問一下struct timespe 是從哪個檔案宣告的嗎? 我找不到他定義在哪因為他的只有sec跟nsec 但是sec對30ms太多 nsec又太小 我想要自己改一下定義的型態

,

Yolande Wang:

struct timespe 是系统标准库的一部分,改动可能会影响到依赖此结构的系统和应用程序代码 。

不是有特别的需求,通常建议使用标准库提供的函数和结构体,这些经过了测试在性能和兼容性方面通常都是优化过的。

纳秒 * 1000000 = 毫秒。

,

Ryan:

了解 但是nsec似乎沒有成效,因為RTC暫存器(524M)讀取出來的Count經過除2再除1.048 是以秒為單位所以設定nsec他似乎無法判讀

,

Ryan:

還有一個問題是 我有看到論壇有一篇詢問CC2640 一個ticks大概是多久 有人回覆說默認大概10us那麼CC2340的一個ticks大概是多久呢?

我想說如果知道一個ticks大概多久時間,或許我能換換30ms大概是多少ticks,再代入static int semaphorePend(SemaphoreHandle_t sem, TickType_t ticks)的TickType_t ticks 

,

Yolande Wang:

Ryan 说:那麼CC2340的一個ticks大概是多久呢?

在 FreeRTOS 中,这通常在 FreeRTOSConfig.h 文件中设置 configTICK_RATE_HZ .

configTICK_RATE_HZ 的值,代表了系统的 tick rate 。

,

Ryan:

1秒=30ms的33.3倍 代表說我只要在static int semaphorePend(SemaphoreHandle_t sem, TickType_t ticks)的TickType_t ticks代入48M除33.3 就等於30ms 是這樣理解的 對嗎?

,

Yolande Wang:

对的。

系统每秒钟有48MHz 次 1 MHz 的周期,而(33.3)倍就是接近30毫秒。

所以您将 ticks 设为 1441,可以在 semaphorePend 中等待大约 30毫秒。

,

Ryan:

了解!那想再請問一下 為何代入的不是1441000 而是 1441呢

,

Yolande Wang:

抱歉,

Ryan 说:CC2340的一個ticks大概是多久呢?

所以 CC2340 的一個 ticks 大概也是 10us.

另外,得先确认 下面这个函数的tick是基于主时钟频率还是基于一个配置的周期性定时器中断。

Ryan 说:semaphorePend(SemaphoreHandle_t sem, TickType_t ticks)的TickType_t ticks 

,

Ryan:

了解! 感謝

,

Yolande Wang:

不客气。

赞(0)
未经允许不得转载:TI中文支持网 » CC2340R5: sem_wait的tick單位
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1