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

简约式网站著名网页设计师及作品

简约式网站,著名网页设计师及作品,建设商务网站目的,手机网站的推广单片机主循环与中断资源访问冲突案例分析 在嵌入式系统中,主循环(Main Loop)和中断服务程序(ISR)共享资源时,如果处理不当,会引发竞态条件(Race Condition)或数据不一致…

单片机主循环与中断资源访问冲突案例分析

在嵌入式系统中,主循环(Main Loop)和中断服务程序(ISR)共享资源时,如果处理不当,会引发竞态条件(Race Condition)或数据不一致问题。下面通过几个典型案例进行说明:

案例1:共享变量访问冲突

场景描述

  • 主循环:周期性读取传感器数据并计算平均值
  • 定时器中断:每10ms更新一次传感器原始数据

冲突代码示例

uint16_t sensorData;  // 共享资源// 主循环
void main(void) {uint32_t sum = 0;uint8_t count = 0;while(1) {sum += sensorData;  // ① 读取共享变量count++;if(count >= 100) {printf("Average: %lu\n", sum / count);sum = 0;count = 0;}}
}// 定时器中断服务程序
void TIMER_ISR(void) {sensorData = ReadSensor();  // ② 更新共享变量
}

冲突原因

  • 当主循环执行①行读取sensorData时,可能被②行的中断打断
  • 若中断更新了sensorData,主循环可能读取到部分更新的数据
  • 导致计算的平均值不准确

解决方案

uint16_t sensorData;
bool dataUpdated = false;// 主循环
void main(void) {uint32_t sum = 0;uint8_t count = 0;while(1) {uint16_t localData;__disable_irq();           // 关中断if(dataUpdated) {localData = sensorData;dataUpdated = false;}__enable_irq();            // 开中断if(!dataUpdated) {sum += localData;count++;// ...}}
}// 定时器中断服务程序
void TIMER_ISR(void) {sensorData = ReadSensor();dataUpdated = true;
}

案例2:缓冲区访问冲突

场景描述

  • 主循环:处理串口接收缓冲区数据
  • 串口中断:将接收到的字节存入缓冲区

冲突代码示例

#define BUFFER_SIZE 16
uint8_t rxBuffer[BUFFER_SIZE];
uint8_t bufferHead = 0;
uint8_t bufferTail = 0;// 主循环
void main(void) {while(1) {if(bufferHead != bufferTail) {  // ① 检查缓冲区是否有数据uint8_t data = rxBuffer[bufferTail];  // ② 读取数据bufferTail = (bufferTail + 1) % BUFFER_SIZE;  // ③ 更新尾指针ProcessData(data);}}
}// 串口接收中断
void UART_RX_ISR(void) {uint8_t data = UART_Read();rxBuffer[bufferHead] = data;  // ④ 写入数据bufferHead = (bufferHead + 1) % BUFFER_SIZE;  // ⑤ 更新头指针
}

冲突原因

  • 当主循环执行①-③行操作时,可能被④-⑤行的中断打断
  • 若中断更新了bufferHead,主循环可能误判缓冲区状态
  • 导致数据丢失或缓冲区溢出

解决方案

#define BUFFER_SIZE 16
uint8_t rxBuffer[BUFFER_SIZE];
uint8_t bufferHead = 0;
uint8_t bufferTail = 0;// 主循环
void main(void) {while(1) {uint8_t localHead;__disable_irq();localHead = bufferHead;__enable_irq();if(localHead != bufferTail) {uint8_t data = rxBuffer[bufferTail];__disable_irq();bufferTail = (bufferTail + 1) % BUFFER_SIZE;__enable_irq();ProcessData(data);}}
}// 串口接收中断
void UART_RX_ISR(void) {uint8_t data = UART_Read();uint8_t nextHead = (bufferHead + 1) % BUFFER_SIZE;if(nextHead != bufferTail) {  // 检查缓冲区是否已满rxBuffer[bufferHead] = data;bufferHead = nextHead;} else {HandleBufferOverflow();}
}

案例3:外设操作冲突

场景描述

  • 主循环:配置SPI接口并发送数据到Flash
  • 定时器中断:周期性采集ADC数据并通过SPI发送到外部设备

冲突代码示例

// 主循环
void main(void) {while(1) {SPI_Configure(SPI_MODE_FLASH);  // ① 配置SPI为Flash模式SPI_Write(flashData, FLASH_SIZE);  // ② 发送数据到Flash// ...}
}// 定时器中断
void TIMER_ISR(void) {uint16_t adcData = ADC_Read();SPI_Configure(SPI_MODE_SENSOR);  // ③ 配置SPI为传感器模式SPI_Write(&adcData, 2);  // ④ 发送ADC数据
}

冲突原因

  • 主循环执行①-②行时,可能被③-④行的中断打断
  • 中断修改了SPI配置,导致主循环发送的数据格式错误
  • 造成Flash写入失败或数据传输错误

解决方案

bool spiBusy = false;// 主循环
void main(void) {while(1) {if(!spiBusy) {spiBusy = true;SPI_Configure(SPI_MODE_FLASH);SPI_Write(flashData, FLASH_SIZE);spiBusy = false;}}
}// 定时器中断
void TIMER_ISR(void) {if(!spiBusy) {uint16_t adcData = ADC_Read();spiBusy = true;SPI_Configure(SPI_MODE_SENSOR);SPI_Write(&adcData, 2);spiBusy = false;}
}

冲突预防原则

  1. 最小化临界区:只在访问共享资源的短时间内关中断
  2. 使用原子操作:对标志位等简单变量使用原子操作
  3. 资源状态管理:使用标志位标记资源是否正在使用
  4. 中断优先级控制:关键任务使用更高优先级中断
  5. 数据复制:中断中只进行数据采集,处理放到主循环

通过合理的资源管理和同步机制,可以有效避免主循环与中断之间的冲突。


文章转载自:

http://zddlti8c.ckwrn.cn
http://rte7R3Bc.ckwrn.cn
http://IdjIklBX.ckwrn.cn
http://EuJpGfG6.ckwrn.cn
http://KaT8SgMF.ckwrn.cn
http://2DyJGcWm.ckwrn.cn
http://b53W1xQh.ckwrn.cn
http://WiL1QXxr.ckwrn.cn
http://pe1IESFF.ckwrn.cn
http://vLNivk5D.ckwrn.cn
http://GLUT6saD.ckwrn.cn
http://2D3nZZ9F.ckwrn.cn
http://ip6UDdlC.ckwrn.cn
http://9lRHsEgq.ckwrn.cn
http://L2bHx0nZ.ckwrn.cn
http://hm2Xmwde.ckwrn.cn
http://EgeneJjJ.ckwrn.cn
http://pFkFpr6Y.ckwrn.cn
http://fpLwz5KY.ckwrn.cn
http://2SIn2PhX.ckwrn.cn
http://NoVgEkBt.ckwrn.cn
http://oEqYrCIQ.ckwrn.cn
http://QQgeQwyR.ckwrn.cn
http://zc2GVEbK.ckwrn.cn
http://8BpBqwg1.ckwrn.cn
http://sz4PuGpM.ckwrn.cn
http://WZrL5ErC.ckwrn.cn
http://C1ihXwi1.ckwrn.cn
http://eI55u0lo.ckwrn.cn
http://f4Hh9Wlk.ckwrn.cn
http://www.dtcms.com/wzjs/743593.html

相关文章:

  • 万网是做网站的吗马云预测明年房价
  • 学校网站免费建设怎么发布自己的网站
  • 关于建设网站的会议纪要山东东营市旅游景点大全
  • 网站建设后怎么赚钱新西兰网站建设
  • 南阳网站seo报价wordpress背景特效
  • 天宁寺网站建设昆明seo排名外包
  • 电商网站开发平台需要多少怎么建立国外网站
  • 怎样将自己做的网页加入网站软件开发外包服务
  • 谁有做那事的网站装饰工程网站模板
  • 做网站图片素材安装wordpress php
  • 网站设计导航栏怎么做wordpress边栏 插件
  • 稳定的常州网站推广wordpress 阿里
  • 网站顶部导航凡客家具
  • 广州好的网站设计公司南京 高端网站建设
  • 手机界面设计网站海外网红营销平台
  • 搜不到wordpress 网站百度产品推广怎么收费
  • 欧洲站vat激活网络推广 推广
  • 常州自助做网站建筑设计网址大全
  • 网站页面设计图片素材眼镜企业网站建设方案
  • 网站 云建站中国互联网数据平台
  • 如何做网站知乎火锅料网站方案怎么做
  • 网站建设发展状况江西省上饶市网站建设公司
  • 建设银行荆门招聘网站wordpress公共聊天室
  • 行业外贸网站建设宁德市城乡建设网站
  • 美食攻略网站建设课程设计梧州网站设计公司
  • 网络考试seo教程优化
  • 肥城住房和城乡建设局网站威海做网站
  • 定制网站大概多少钱浙江省建设监理协会官方网站
  • 谷歌账号注册网站打不开龙岗网站建设要多少钱
  • 哪些网站可以做签约设计师网站开发公司资讯