问题标签 [non-volatile]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 多线程中的Java volatile关键字
我试图重现 Java 多线程中的非易失性变量行为。test
在这里,我在OccurrenceCounter.java类中有非易失性变量。在ThreadDemo.java类中,我有main
生成两个线程的方法。在其中不断检查
while循环thread1
中非易失性变量的值。如果我在MyRunnableThread1.javatest
中运行下面的示例,则值不是从 CPU 缓存中获取的。occurrenceCounter.isTest()
OccurrenceCounter.java:
MyRunnableThread1.java:
MyRunnableThread2.java:
线程演示.java:
在 while 循环中的MyRunnableThread1.javaoccurrenceCounter.isTest()
中,即使类中的test
变量OcuurenceCounter
是非易失性的,条件也不会从 CPU 缓存中返回。但是如果我删除第一个 while 循环:
然后我可以看到条件occurrenceCounter.isTest()
总是错误的,即使它是更新的thread2
并且thread1
永远不会终止。那么为什么这个while循环:
影响非易失性变量的行为?这是第一个while循环强制从内存而不是从CPU缓存中读取值thread1
吗?我试图得到这个答案很多。但我做不到。
请任何人帮助我解决这个问题。
c++ - 为什么这种易失性访问可以相对于非易失性访问重新排序?
下面的代码示例来自一个中文博客,介绍了volatile
. 左边是C代码;另一个是生成的汇编代码。
正如我们在汇编代码中看到的, 的副作用A
放在 的 副作用之后B
,即使B
是volatile
合格的。但是,cppreference.com 说:
[W]在单个执行线程中,不能优化或重新排序易失性访问,并使用另一个可见的副作用,即先排序或先排序后易失性访问。
这里的副作用A
是在之前排序的B
,所以我认为编译器这样做是非法的。我对吗?
作为补充,博客说如果我们要保证 avolatile
和non-volatile
type 之间的顺序,我们需要同时做volatile
:
java - 如果 getter 被标记为同步,为什么这段代码会完成?
get()
尽管字段值不是易失性的,为什么当方法被标记为同步时此代码成功完成?如果没有同步,它会在我的机器上无限期地运行(如预期的那样)。
avr - 从 ATtiny1616 EEPROM 读/写
在 avr-gcc 中使用 ATting1616 我正在尝试读取和写入 EEPROM。
ATtiny1616 使用 NVMCTRL - 非易失性存储器控制器进行字节级读/写。我正在使用 NVMCTRL 从 EEPROM 读取/写入块,但它无法正常工作。
这是一个示例来演示我正在尝试做的事情。
假设我要在 EEPROM 中保存两个不同的值,然后读回每个值。
以下是读/写函数:
如果 test_data[7] 被打印,则转换的值将是“测试”。在调试模式下查看内存时,我可以看到该值始终被写入数据 EEPROM 中的第一个内存位置。[0x1400] 在这种情况下,从内存 x1400 开始,“测试”的值开始。
在读写 EEPROM 时,我似乎无法理解一些基本的东西。任何指导将不胜感激。
partitioning - 我们可以在 ESP32 中真正使用多少 NVS 数据?
我正在检查我的 NVS 存储容量。这是我做分区时的输出。
编译器版本:5.2.0
Python requirements from /home/dhananjay/esp/esp-idf/requirements.txt
都满意。生成的分区表二进制文件。内容:
这表明我可以使用 16k 的 nvs 存储,但是当我通过命名空间“storage”和键“a”-“p”写入 nvs 时,每个键包含 1022 字节的数据。我得到这个输出。
我只能存储 10220 Kb 的数据,请帮忙。
tpm - TPM 非易失性内存大小?
我现在正在使用 IBM TPM v1332 + IBM TSS v1470,并尝试将一些重要的关键字/密码存储到 TPM 上的非易失性内存中。我找到了两种方法。一种是创建一个密封对象并用于evictcontrol
存储它,例如:
${PREFIX}evictcontrol -ho $objHandle -hp 81800002 -hi p
另一种方法是直接使用 NV 命令来存储一些东西:
${PREFIX}nvdefinespace -hi o -ha 01000000 -pwdn nnn
${PREFIX}nvwrite -ha 01000000 -pwdn nnn
但是,我找不到有关 TPM 中可用的非易失性空间的任何信息。这在 TPM 规范中有描述吗?我在哪里可以找到信息?谢谢。
java - 为什么没有“volatile”的程序会像“volatile”一样工作?
如下所示,该程序有一个共享 var flag
,但没有volatile
:
程序总是正常返回。所以我相信P1
,flag
设置为的行在其他线程中true
更新。flag
但为什么?flag
不是易变的,为什么它的值会立即更新?总是!
c - Assign volatile to non-volatile sematics and the C standard
This code busy-waits for the variable to turn to 1
. If on first pass vfoo
is not set to 1
, will I get stuck inside.
This code compiles without warning. What does the standard say about this?
vfoo
is declared asvolatile
. Therefore, read to this variable should not be optimized.- However, bar is not
volatile
qualified. Is the compiler allowed to optimize the write to thisbar
? .i.e. the compiler would do a read access tovfoo
, and is allowed to discard this value and not assign it tobar
(at L.7). - If this is a special case where the standard has something to say, can you please include the clause and interpret the standard's lawyer talk?
linker - 使用非易失性存储器 (NVRAM) 时 ld 链接脚本的加载地址 (LMA)
我正在为 TI 的 MSP430 MCU 开发裸机应用程序。该 MCU 使用非易失性存储器 FRAM。以下 SRAM 脚本运行良好:
__data_load_start 获取闪存中的加载内存地址(隐式?),并在 RAM 中保留一些空间。
现在,我想将它用于非易失性存储器。这个内存区域,在某些情况下会被重新初始化为它们的初始值,因此加载地址(LMA)和虚拟地址(VMA)会不同,如ld 文档中所述。
但是,它不起作用。查看 .map 输出文件显示加载地址已设置在任何内存部分之外:/
我想明确指定这个内存区域的初始值的位置。有人可以帮忙吗?
编辑:
我试图更新脚本没有任何隐式规则:
但在这种情况下,之后声明的每个部分都会在 VMA 和 LMA 之间获得一个偏移量。例如,下面的部分给出(.map 文件):
但是两个地址应该相同:/
postgresql - 非易失性函数中不允许 CREATE TABLE
我有以下三个表:
我在这些表上编写了以下函数来显示患者的药物列表(患者 ID 是参数):
但是,它给了我这个错误:
非易失性函数中不允许 CREATE TABLE