OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@96 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXpresso1769.Memory.js
1 /**\r
2  * @fileOverview LPCXpresso1769のメモリアクセスクラスを定義する。\r
3  */\r
4 \r
5 (function(){\r
6 var DEV=LPCXpresso1769;\r
7 var BCF=DEV._BCF;\r
8 var EE=DEV._EE;\r
9 var isUndef=MiMicLib.isUndef;\r
10 /**\r
11  * LPCXPresso1769.Memory (Memory)クラスのコンストラクタ。\r
12  * Memoryクラスは、MCUのメモリ空間へアクセスする手段を提供する。\r
13  * このクラスは、メモリアクセス対してなんら保護機能を持たない。MCUのメモリマップに十分に注意する必要がある。\r
14  * @name LPCXpresso1769.Memory\r
15  * @constructor\r
16  * @param {object as LPCXpresso1769.Mcu} i_mcu\r
17  * インスタンスを結びつけるMcuオブジェクト。\r
18  * @param {int} i_base\r
19  * メモリにアクセスするときのベースアドレス。省略可能である。省略時は0x0とみなす。4バイト境界でなければならない。クラスの提供する関数でアドレスを指定した時には、全てこの値が加算される。\r
20  * @example\r
21  * //create a controlable MCU via network.\r
22  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
23  * var memory=new LPCXpresso1769.Memory(mcu); \r
24  */\r
25 DEV.Memory=function Memory(i_mcu,i_base)\r
26 {\r
27         if(!isUndef(i_base)){\r
28                 this._base=i_base;\r
29         }\r
30         this._mcu=i_mcu;\r
31 }\r
32 DEV.Memory.prototype=\r
33 {\r
34         _base:0x00000000,\r
35         _mcu:null,\r
36         /**\r
37          * 指定したアドレスの32ビット値を取得する。\r
38          * @name LPCXpresso1769.Memory#read32^2\r
39          * @function\r
40          * @param {int} i_offset\r
41          * コンストラクタで指定したアドレスからのオフセット位置を指定する。4バイト境界でなければならない。\r
42          * @return {int}\r
43          * 1個のint値。\r
44          * @example\r
45          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
46          * var mem=new LPCXpresso1769.Memory(mcu); //create instance\r
47          * alert(mem.read32(0x00000000)); //show 1 value \r
48          */\r
49         /**\r
50          * 指定したオフセットから、i_sizeバイトのメモリに格納した値を、それぞれ32ビット単位で値を取得する。i_offsetの位置から、32bit単位でi_size/4個の値を取得することになる。シーケンシャルアクセスに使用する。\r
51          * @name LPCXpresso1769.Memory#read32^3\r
52          * @function\r
53          * @param {int} i_offset\r
54          * コンストラクタで指定したアドレスからのオフセット位置を指定する。4バイト境界でなければならない。\r
55          * @param {int} i_size\r
56          * 取得するバイト数を指定する。4バイト単位でなければならない。      \r
57          * @return {int or Array[int]}\r
58          * 取得する値の個数は、i_size/4個である。個数により、戻り値の型が異なるので注意すること。\r
59          * @example\r
60          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
61          * var mem=new LPCXpresso1769.Memory(mcu); //create instance\r
62          * mem.read32(0x0,8); //return 2 values.\r
63          */\r
64         /**\r
65          * オフセットの配列要素に対応した値を、それぞれ32ビット単位で取得する。\r
66          * ランダムアクセスに使用する。\r
67          * @name LPCXpresso1769.Memory#read32^4\r
68          * @function\r
69          * @param {array[int]} i_offsets\r
70          * オフセットアドレスの配列。それぞれ4バイト境界でなければならない。\r
71          * @return {int or Array[int]}\r
72          * 返却される値の個数は、i_offsetの長さと同じになる。個数により、戻り値の型が異なるので注意すること。\r
73          * @example\r
74          * var mcu=new LPCXpresso1769.Mcu("192.168.0.39");\r
75          * var mem=new LPCXpresso1769.Memory(mcu); //create instance\r
76          * mem.read32([0x0,0x14,0x08]); //return 3 values by specified order.\r
77          */\r
78         /**\r
79          * メモリから値を読み出して、値セットの配列、又は値を返す。\r
80          * 関数はバイト単位のアライメントでメモリにアクセスする。メモリアドレス、取得サイズは4バイト境界に一致させなければならない。\r
81          * 引数の違いにより、数種類の呼び出し方がある。\r
82          * @name LPCXpresso1769.Memory#read32^1\r
83          * @function\r
84          * @param ...\r
85          * 詳細は、read32^nを参照。\r
86          * @return {int or Array[int]}\r
87          * 返却値の数により、型が異なる。1個の場合はint値、複数の場合はint型の配列である。
88          */\r
89         read32:function read32(/*arguments*/)\r
90         {\r
91                 try{\r
92                         function checkAlign(v){\r
93                                 if(v%4!=0){\r
94                                         throw new MiMicException(EE.INVALID_ARG,"An alignment is not 32bit unit.");\r
95                                 }\r
96                         }\r
97                         var bc="";\r
98                         var ar=new Array();\r
99                         var offset=arguments[0];\r
100                         switch(arguments.length){\r
101                         case 1:\r
102                                 if(!isNaN(offset)){\r
103                                         //read32(i_offset:int)\r
104                                         checkAlign(offset);\r
105                                         bc=BCF.READMEM;\r
106                                         ar.push(this._base+offset);\r
107                                 }else{\r
108                                         //read32(i_offsets:array)\r
109                                         for(var i=0;i<offset.length;i++){\r
110                                                 checkAlign(offset[i]);\r
111                                                 bc+=BCF.getMem(this._base+offset[i],ar);\r
112                                         }\r
113                                 }\r
114                                 break;\r
115                         case 2:\r
116                                 //read32(i_offset:int,i_size:int)\r
117                                 checkAlign(offset);\r
118                                 checkAlign(arguments[1]);\r
119                                 var l=arguments[1]/4;\r
120                                 for(var i=0;i<l;i++){\r
121                                         bc+=BCF.READMEM;\r
122                                         ar.push(this._base+offset+i*4);\r
123                                 }\r
124                                 break;\r
125                         default:\r
126                                 break;\r
127                         }\r
128                         var ret=this._mcu.callMiMicWithCheck(bc+BCF.END,ar).stream;\r
129                         return ret.length==1?ret[0]:ret;\r
130                 }catch(e){\r
131                         throw new MiMicException(e);\r
132                 }\r
133         }\r
134 }\r
135 \r
136 }());