当前位置: 首页 > wzjs >正文

网站域名为个人的公司能备案关键词优化seo费用

网站域名为个人的公司能备案,关键词优化seo费用,做美食网站的目的,模板网站的缺点目录 概述 1 信号量类型及特性 1.1 信号量类型 1.2 信号量 vs 其他同步机制 2 核心 API 函数 2.1 信号量定义与初始化 2.2 信号量获取 2.3 信号量释放 2.4 信号量状态查询 2.5 重置信号量 3 典型应用场景 3.1 资源池管理(计数信号量) 3.2 …

目录

概述

1 信号量类型及特性

1.1 信号量类型

1.2  信号量 vs 其他同步机制

2 核心 API 函数

2.1 信号量定义与初始化

2.2 信号量获取

2.3  信号量释放

2.4 信号量状态查询

2.5 重置信号量

3 典型应用场景

3.1 资源池管理(计数信号量)

3.2 生产者-消费者同步

3.3 互斥访问(临界区保护)

3.4 多线程协同工作

3.5 实战案例:多传感器数据采集系统

4 高级用法与技巧

4.1 中断服务程序 (ISR) 中的信号量

4.2 与超时结合使用

4.3 优先级继承(使用互斥信号量)

4.4 信号量链式同步

5 性能优化与最佳实践

5.1  避免优先级反转

5.2 减少信号量争用


概述

本文主要介绍Zephyr RTOS 信号量 (Semaphore) 的使用方法,信号量是 Zephyr RTOS 中最核心的同步机制之一,用于解决线程间同步、资源管理和互斥访问问题。Zephyr 的信号量机制提供了强大而灵活的线程同步能力。正确使用信号量可以构建出高效、响应迅速且资源利用率高的嵌入式系统。对于关键任务系统,其通过结合优先级继承和超时控制,确保系统在极端情况下的可靠性。

1 信号量类型及特性

1.1 信号量类型

类型初始值最大计数主要用途特点
计数信号量N (N>0)MAX (通常>1)资源池管理允许多个线程同时访问资源
二进制信号量0 或 11任务同步/互斥可替代互斥锁
互斥信号量11临界区保护支持优先级继承

1.2  信号量 vs 其他同步机制

机制最佳场景线程唤醒优先级继承中断安全
信号量资源计数/任务同步FIFO/优先级否(互斥除外)Give操作安全
互斥锁临界区保护优先级继承不安全
消息队列数据传输FIFOPut操作安全
事件多事件通知所有等待线程安全
条件变量复杂条件等待单个线程不安全

2 核心 API 函数

2.1 信号量定义与初始化

/* 静态定义 */
K_SEM_DEFINE(my_sem, initial_count, max_count);/* 动态初始化 */
struct k_sem my_sem;
k_sem_init(&my_sem, initial_count, max_count);

2.2 信号量获取

1)函数原型

int k_sem_take(struct k_sem *sem, k_timeout_t timeout);

2)参数

  • sem: 信号量指针

  • timeout: 超时设置(K_NO_WAIT, K_FOREVER, K_MSEC(ms))

 3)返回值

  • 0: 成功获取

  • -EAGAIN: 非阻塞模式下信号量不可用

  • -EINVAL: 无效参数

  • -ETIMEDOUT: 超时

 2.3  信号量释放

1)函数原型

void k_sem_give(struct k_sem *sem);

2)功能介绍

  • 在中断上下文安全使用

  • 如果线程在等待,唤醒优先级最高的线程

 2.4 信号量状态查询

函数原型:

// 获取当前信号量计数
unsigned int k_sem_count_get(struct k_sem *sem);// 检查信号量是否可用
int k_sem_takeable(struct k_sem *sem); // 1=可用, 0=不可用

2.5 重置信号量

函数原型:

void k_sem_reset(struct k_sem *sem); // 重置为初始值

3 典型应用场景

3.1 资源池管理(计数信号量)

#define MAX_CONNECTIONS 5
K_SEM_DEFINE(db_sem, MAX_CONNECTIONS, MAX_CONNECTIONS);void db_thread(void) {if (k_sem_take(&db_sem, K_MSEC(100)) {LOG_ERR("数据库连接超时");return;}// 访问数据库execute_query();k_sem_give(&db_sem); // 释放连接
}

3.2 生产者-消费者同步

K_SEM_DEFINE(data_ready, 0, 1); // 二进制信号量// 生产者
void sensor_thread(void) {while (1) {read_sensor_data();k_sem_give(&data_ready); // 通知消费者k_sleep(K_MSEC(10));}
}// 消费者
void process_thread(void) {while (1) {k_sem_take(&data_ready, K_FOREVER); // 等待数据process_data();}
}

3.3 互斥访问(临界区保护)

K_SEM_DEFINE(flash_mutex, 1, 1); // 二进制信号量void write_flash(void) {k_sem_take(&flash_mutex, K_FOREVER);// 临界区 - 安全访问Flashflash_write_data();k_sem_give(&flash_mutex);
}

3.4 多线程协同工作

K_SEM_DEFINE(step1_done, 0, 1);
K_SEM_DEFINE(step2_done, 0, 1);void thread_A(void) {perform_step1();k_sem_give(&step1_done); // 通知线程Bk_sem_take(&step2_done, K_FOREVER); // 等待线程Bperform_step3();
}void thread_B(void) {k_sem_take(&step1_done, K_FOREVER); // 等待线程Aperform_step2();k_sem_give(&step2_done); // 通知线程A
}

3.5 实战案例:多传感器数据采集系统

#include <zephyr/kernel.h>
#include <zephyr/drivers/sensor.h>K_SEM_DEFINE(temp_ready, 0, 1);
K_SEM_DEFINE(humid_ready, 0, 1);
K_SEM_DEFINE(data_mutex, 1, 1);struct sensor_data {float temperature;float humidity;
} current_data;// 温度传感器线程
void temp_thread(void) {const struct device *temp_sensor = DEVICE_DT_GET(DT_NODELABEL(temp0));while (1) {sensor_sample_fetch(temp_sensor);k_sem_take(&data_mutex, K_FOREVER);sensor_channel_get(temp_sensor, SENSOR_CHAN_AMBIENT_TEMP, &current_data.temperature);k_sem_give(&data_mutex);k_sem_give(&temp_ready);k_sleep(K_SECONDS(2));}
}// 湿度传感器线程
void humid_thread(void) {const struct device *humid_sensor = DEVICE_DT_GET(DT_NODELABEL(humid0));while (1) {sensor_sample_fetch(humid_sensor);k_sem_take(&data_mutex, K_FOREVER);sensor_channel_get(humid_sensor, SENSOR_CHAN_HUMIDITY, &current_data.humidity);k_sem_give(&data_mutex);k_sem_give(&humid_ready);k_sleep(K_SECONDS(3));}
}// 数据处理线程
void processing_thread(void) {while (1) {// 等待两种数据就绪k_sem_take(&temp_ready, K_FOREVER);k_sem_take(&humid_ready, K_FOREVER);k_sem_take(&data_mutex, K_FOREVER);float temp = current_data.temperature;float humid = current_data.humidity;k_sem_give(&data_mutex);// 计算露点float dew_point = calculate_dew_point(temp, humid);printk("温度: %.1fC, 湿度: %.1f%%, 露点: %.1fC\n", temp, humid, dew_point);}
}

4 高级用法与技巧

4.1 中断服务程序 (ISR) 中的信号量

K_SEM_DEFINE(adc_ready, 0, 1);// ADC转换完成中断
void adc_isr(const void *arg) {k_sem_give(&adc_ready); // 在ISR中安全释放信号量
}// 处理线程
void adc_thread(void) 
{while (1) {if (k_sem_take(&adc_ready, K_MSEC(500)) {process_adc_data();} else {LOG_WRN("ADC数据超时");}}
}

4.2 与超时结合使用

#define TIMEOUT_MS 200void critical_operation(void) {if (k_sem_take(&resource_sem, K_MSEC(TIMEOUT_MS))) {// 成功获取资源do_work();k_sem_give(&resource_sem);} else {// 超时处理handle_timeout();}
}

4.3 优先级继承(使用互斥信号量)

// 定义互斥信号量
K_MUTEX_DEFINE(high_pri_mutex);void high_pri_thread(void) {k_mutex_lock(&high_pri_mutex, K_FOREVER);// 临界区k_mutex_unlock(&high_pri_mutex);
}void low_pri_thread(void) {k_mutex_lock(&high_pri_mutex, K_FOREVER);// 执行期间会临时提升优先级k_mutex_unlock(&high_pri_mutex);
}

4.4 信号量链式同步

K_SEM_DEFINE(stage1, 0, 1);
K_SEM_DEFINE(stage2, 0, 1);
K_SEM_DEFINE(stage3, 0, 1);void pipeline_thread(void) {k_sem_take(&stage1, K_FOREVER);process_stage1();k_sem_give(&stage2);k_sem_take(&stage2, K_FOREVER);process_stage2();k_sem_give(&stage3);k_sem_take(&stage3, K_FOREVER);process_stage3();
}

5 性能优化与最佳实践

5.1  避免优先级反转

 

解决方案

  • 使用互斥信号量 (k_mutex) 替代二进制信号量

  • 限制临界区执行时间

  • 优先级继承机制

5.2 减少信号量争用

// 错误用法 - 频繁信号量操作
for (int i = 0; i < 100; i++) {k_sem_take(&sem, K_FOREVER);update_single_value(i);k_sem_give(&sem);
}// 优化用法 - 批量处理
k_sem_take(&sem, K_FOREVER);
for (int i = 0; i < 100; i++) {update_single_value(i);
}
k_sem_give(&sem);

http://www.dtcms.com/wzjs/423393.html

相关文章:

  • 阜新网站建设2022最近比较火的热点话题
  • 网页设计建网站安徽新站优化
  • 东光网站建设网址seo优化排名
  • 如何选择制作网站公司想学互联网从哪里入手
  • 投资公司靠什么赚钱的seo网络推广优化教程
  • 界面设计心得网站seo哪家做的好
  • 佛山 政府网站 建设 规范成都最好的网站推广优化公司
  • 广州站有高铁吗seo关键词排名价格
  • 怎么把网站和域名绑定软件推广的渠道是哪里找的
  • 网站建设服务价格seo公司厦门
  • 广州做网站公司排名elo机制
  • 爱情动作片做网站站长工具怎么关闭
  • 备案怎么关闭网站吗佛山百度网站排名优化
  • 有经验的做网站小红书关键词热度查询
  • 网页设计公司上海手机优化大师哪个好
  • 网站上的流动图片怎么做的友链出售
  • 环球资源网商务网站建设目的网络软文营销是什么意思
  • 做宠物食品的网站郑州网站推广技术
  • 帮人做网站推选的公司深圳网络推广优化
  • 邢台建设一个企业网站seo怎么优化方法
  • 找别人做网站要注意什么软件什么平台可以打广告做宣传
  • 网站测试教程电商网站设计方案
  • 沙元浦做网站的公司怎么看百度关键词的搜索量
  • 页游赚钱福州外包seo公司
  • 我的世界找建筑网站如何给公司做网络推广
  • b2b电子商务营销平台有哪些合肥seo优化排名公司
  • 苏州建设监理有限公司网站企点qq官网
  • 开私服传奇做网站需要钱嘛百度注册网站怎么弄
  • 网络销售许可证网站seo优化技能
  • 深圳学校网站建设哪家好合肥百度快照优化排名