rCore-Tutorial-v3/ch6/volatile/index.html
2022-05-03 12:09:53 +00:00

36 lines
8.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Provides wrapper types `Volatile`, `ReadOnly`, `WriteOnly`, `ReadWrite`, which wrap any copy-able type and allows for volatile memory access to wrapped value. Volatile memory accesses are never optimized away by the compiler, and are useful in many low-level systems programming and concurrent contexts."><meta name="keywords" content="rust, rustlang, rust-lang, volatile"><title>volatile - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../dark.css" disabled><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../storage.js"></script><script src="../crates.js"></script><script defer src="../main.js"></script>
<noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../volatile/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"></h2>
</nav>
<nav class="sidebar"><a class="sidebar-logo" href="../volatile/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"><a href="#">Crate volatile</a></h2><div class="sidebar-elems"><div class="block"><ul><li class="version">Version 0.3.0</li><li><a id="all-types" href="all.html">All Items</a></li></div></ul><section><div class="block"><ul><li><a href="#structs">Structs</a></li><li><a href="#types">Type Definitions</a></li></ul></div></section><div id="sidebar-vars" data-name="volatile" data-ty="mod" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../volatile/index.html"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></a><nav class="sub"><div class="theme-picker hidden"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="22" height="22" alt="Pick another theme!" src="../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><div class="main-heading">
<h1 class="fqn"><span class="in-band">Crate <a class="mod" href="#">volatile</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../clipboard.svg" width="19" height="18" alt="Copy item path"></button></span></h1><span class="out-of-band"><a class="srclink" href="../src/volatile/lib.rs.html#1-310">source</a> · <a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Provides wrapper types <code>Volatile</code>, <code>ReadOnly</code>, <code>WriteOnly</code>, <code>ReadWrite</code>, which wrap any copy-able type and allows for
volatile memory access to wrapped value. Volatile memory accesses are never optimized away by
the compiler, and are useful in many low-level systems programming and concurrent contexts.</p>
<p>The wrapper types <em>do not</em> enforce any atomicity guarantees; to also get atomicity, consider
looking at the <code>Atomic</code> wrapper type found in <code>libcore</code> or <code>libstd</code>.</p>
<p>These wrappers do not depend on the standard library and never panic.</p>
<h2 id="dealing-with-volatile-pointers"><a href="#dealing-with-volatile-pointers">Dealing with Volatile Pointers</a></h2>
<p>Frequently, one may have to deal with volatile pointers, eg, writes to specific memory
locations. The canonical way to solve this is to cast the pointer to a volatile wrapper
directly, eg:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use</span> <span class="ident">volatile::Volatile</span>;
<span class="kw">let</span> <span class="ident">mut_ptr</span> <span class="op">=</span> <span class="number">0xFEE00000</span> <span class="kw">as</span> <span class="kw-2">*mut</span> <span class="ident">u32</span>;
<span class="kw">let</span> <span class="ident">volatile_ptr</span> <span class="op">=</span> <span class="ident">mut_ptr</span> <span class="kw">as</span> <span class="kw-2">*mut</span> <span class="ident">Volatile</span><span class="op">&lt;</span><span class="ident">u32</span><span class="op">&gt;</span>;</code></pre></div>
<p>and then perform operations on the pointer as usual in a volatile way. This method works as all
of the volatile wrapper types are the same size as their contained values.</p>
</div></details><h2 id="structs" class="small-section-header"><a href="#structs">Structs</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.ReadOnly.html" title="volatile::ReadOnly struct">ReadOnly</a></div><div class="item-right docblock-short"><p>A volatile wrapper which only allows read operations.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.Volatile.html" title="volatile::Volatile struct">Volatile</a></div><div class="item-right docblock-short"><p>A wrapper type around a volatile variable, which allows for volatile reads and writes
to the contained value. The stored type needs to be <code>Copy</code>, as volatile reads and writes
take and return copies of the value.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.WriteOnly.html" title="volatile::WriteOnly struct">WriteOnly</a></div><div class="item-right docblock-short"><p>A volatile wrapper which only allows write operations.</p>
</div></div></div><h2 id="types" class="small-section-header"><a href="#types">Type Definitions</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="type" href="type.ReadWrite.html" title="volatile::ReadWrite type">ReadWrite</a></div><div class="item-right docblock-short"><p>A volatile wrapper which allows both read and write operations;
functionally equivalent to the <code>Volatile</code> type, as it is a type
alias for it.</p>
</div></div></div></section><section id="search" class="content hidden"></section></div></main><div id="rustdoc-vars" data-root-path="../" data-current-crate="volatile" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.62.0-nightly (1f7fb6413 2022-04-10)" ></div>
</body></html>