Other Parts Discussed in Thread: CC2640
想問一下 我想讓sem_wait()等待30ms之後就跳出來 我該怎麼設定?
我看了一下原本是semaphorePend(obj->sem, portMAX_DELAY);
#define portMAX_DELAY 0xffffffffUL
這是以 System Clock 1/48M 去算的嗎?
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.
我想讓sem_wait()等待30ms之後就跳出來 我該怎麼設定?
sem_wait() 函数控制着信号量的值。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
semaphorePend(obj->sem, portMAX_DELAY);
#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/
您好,
可以将 sem_waite 替换为 sem_timedwait。
sem_timedwait() API 仅在达到指定的时间或信号量变为可用(以先发生的时间为准)之前阻止。
请参阅:
那麼int sem_timedwait(sem_t *semaphore, const struct timespec *abstime)的struct timespec avstime的單位是甚麼ms還是ns?
或是說他只是一個count 要自己用1/48M 去換算?
这是一个 struct timespe 的定义示例:
使用 sem_timedwait 函数时,需要提供 struct timespe 结构体。
这个时间点是你想让等待操作超时的绝对时间。如果信号量在这个时间之前变得可用,函数将返回成功;反之,函数因超时而返回。
因此,您不需要基于系统时钟频率来计算这个时间。
如果您想让 sem_timedwait 在30 毫秒后超时,你可以计算从当前时间起 30 毫秒后的时间点,将之设置为 sem_timedwait 的 abstime 参数。
能夠請問一下struct timespe 是從哪個檔案宣告的嗎? 我找不到他定義在哪
因為他的只有sec跟nsec 但是sec對30ms太多 nsec又太小 我想要自己改一下定義的型態
struct timespe 是系统标准库的一部分,改动可能会影响到依赖此结构的系统和应用程序代码 。
不是有特别的需求,通常建议使用标准库提供的函数和结构体,这些经过了测试在性能和兼容性方面通常都是优化过的。
纳秒 * 1000000 = 毫秒。
還有一個問題是 我有看到論壇有一篇詢問CC2640 一個ticks大概是多久 有人回覆說默認大概10us
那麼CC2340的一個ticks大概是多久呢?
我想說如果知道一個ticks大概多久時間,或許我能換換30ms大概是多少ticks,再代入static int semaphorePend(SemaphoreHandle_t sem, TickType_t ticks)的TickType_t ticks
那麼CC2340的一個ticks大概是多久呢?
在 FreeRTOS 中,这通常在 FreeRTOSConfig.h 文件中设置 configTICK_RATE_HZ .
configTICK_RATE_HZ 的值,代表了系统的 tick rate 。
1秒=30ms的33.3倍 代表說我只要在static int semaphorePend(SemaphoreHandle_t sem, TickType_t ticks)的TickType_t ticks代入48M除33.3 就等於30ms 是這樣理解的 對嗎?
对的。
系统每秒钟有48MHz 次 1 MHz 的周期,而(33.3)倍就是接近30毫秒。
所以您将 ticks 设为 1441,可以在 semaphorePend 中等待大约 30毫秒。