本项目基于LwIP 2.1.2版本及FreeRTOS开发,旨在构建高效稳定的网络通信系统。结合了轻量级TCP/IP协议栈与实时操作系统的优势,适用于资源受限的嵌入式设备。
下面是接口文件的代码:
如果timeout参数不为零,则返回值表示等待信号量所花费的时间(以毫秒计)。若信号量在指定时间内未能发出信号,则函数将返回SYS_ARCH_TIMEOUT。当线程不需要等待信号量时,该函数会返回0。
```c
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) {
u32_t wait_tick = 0;
u32_t start_tick = 0;
// 检查信号量是否有效
if (*sem == SYS_SEM_NULL)
return SYS_ARCH_TIMEOUT;
// 获取开始等待信号量的时钟节拍
start_tick = xTaskGetTickCount();
// 如果timeout不为零,需要将毫秒转换成系统的时钟节拍单位
if (timeout != 0) {
wait_tick = timeout / portTICK_PERIOD_MS;
if (wait_tick == 0)
wait_tick = 1;
} else {
wait_tick = portMAX_DELAY;
}
// 阻塞等待信号量
if(xSemaphoreTake(*sem, wait_tick) == pdTRUE){
return ((xTaskGetTickCount()-start_tick)*portTICK_RATE_MS);
}
return SYS_ARCH_TIMEOUT;
}
void sys_sem_signal(sys_sem_t *sem) {
if (xSemaphoreGive( *sem ) != pdTRUE)
printf([sys_arch]: sem signal fail!\n);
}
err_t sys_mutex_new(sys_mutex_t *mutex){
// 创建互斥信号量
*mutex = xSemaphoreCreateMutex();
if(*mutex != SYS_MRTEX_NULL)
return ERR_OK;
else {
printf([sys_arch]: new mutex fail!\n);
return ERR_MEM;
}
}
```
以上代码实现了等待和释放信号量,创建互斥锁的功能。