27,516
社区成员
发帖
与我相关
我的任务
分享

[/quote]
给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。
多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。
但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。
为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。
不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。
[/quote]
总结的很好啊。我想说我一般会用register关键字。[/quote]
这是为什么呢,嚎
[/quote]
给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。
多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。
但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。
为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。
不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。
[/quote]
总结的很好啊。我想说我一般会用register关键字。
[/quote]
给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。
多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。
但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。
为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。
不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。
[/quote]
多谢,明白了
[/quote]
给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。
多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。
但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。
为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。
不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。
