4

永続変数は広く使用されていませんか? それらについての情報は、オンラインでも、私の C の教科書である the Art and Science of C の索引でも見つけることができませんでした。

それらについて共有できるもの、特にそのスコープと宣言の例は役に立ちます。キーワードとして「persistent」を使用していると宣言していると思いますか?

static void foo( void ) {
  persistent unsigned int width = 5;
}

これは、私が見つけた唯一の参考資料です。ファイルのロードまたはアンロードの結果としてコードがダウンロードされると、永続変数はその状態を失います。」 http://www.newtonlabs.com/ic/ic_5.html#SEC9

ありがとう!

4

4 に答える 4

8

persistentInteractive C (提供したリンク) はキーワードを提供しますが、それは標準の C ではありません特に、「ボードの電源をオフにしてからオンにしたとき、メインが実行されたとき、およびシステムのリセットが発生したときに状態を維持する」などの保証があるためです。

persistentInteractive C コンパイラが提供され、専用ハードウェア (この場合は Motorola チップ) で動作し、変数値を不揮発性メモリに保存して、再起動後も持続性を実現します。

Interactive C は、多くの Motorola 6811 ベースのロボットおよび組み込みシステム用の C コンパイル環境です。もともと MIT LEGO Robot Design Contest (6.270) のために開発された Interactive C は、広く配布され、使用されています。インタラクティブ C の名声は、そのインタラクティブ性にあります。ユーザーは、式を入力してその場でコンパイルし、長いコンパイルとダウンロードのサイクルを待つのではなく、すぐに実行できます。IC は現在、6.270、HandyBoard、RugWarrior および RugWarrior Pro をサポートしています。 ソース

ローカル スコープ (関数など) で変数の永続性を実現するには、staticキーワードを使用します。

于 2010-12-05T04:01:05.637 に答える
3

必要なキーワードはstatic、ローカル (グローバルではない) コンテキストにあります。

コンテキストが重要です。

#include <stdio.h>

static int foo;

int main(int argc, char **argv){
  //...
}

ここでstaticは、fooにファイル スコープがある (つまり、 ではないextern) ことを意味します。

一方、

char *strtok(char *str, char *sep){
  static char *last;
  //...
}

lastへの呼び出し間で持続しstrtokます。

とは言っても、それらはめったに役に立たないためめったに使用されず、マルチスレッドのコンテキストではまったく受け入れられません (競合状態が発生するのを待っている場合)。

于 2010-12-05T03:57:36.677 に答える
1

jkerian が述べたように、永続変数は、ボードの電源を入れたり切ったりしても状態を維持しますが、これに使用できる唯一のメモリは EEPROM であるため、C スタートアップ コード (コンパイラに依存) によって除外されます。

他の変数と同様に、揮発性メモリに格納された永続変数は、電源が失われると内容を失います。ただし、この種の変数は、FRAM を搭載したデバイスで役立ちます。FRAM は ferroelectric RAM の頭字語で、電源を切ってもデータを保持できる不揮発性メモリです。注: COFF モードの CCS では、初期化されていない変数は (起動時間を節約するために) 0 に設定されていなかったため、常に永続的でした。

于 2016-04-09T11:36:39.927 に答える