質問編集履歴

4

追記修正

2018/10/15 00:14

投稿

FujimuraAkira
FujimuraAkira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -84,6 +84,186 @@
84
84
 
85
85
 
86
86
 
87
+
88
+
89
+ ### 発生している問題・エラーメッセージ
90
+
91
+
92
+
93
+ ```
94
+
95
+ i2c_common.c:113: `dev_mutex' に対する定義されていない参照です
96
+
97
+
98
+
99
+ (同様に参照している箇所にも同じエラーが出ます)
100
+
101
+ ```
102
+
103
+
104
+
105
+ ### 該当のソースコード
106
+
107
+
108
+
109
+ ```C
110
+
111
+
112
+
113
+ extern pthread_mutex_t dev_mutex[3]; // デバイスアクセス用mutex 0~2 I2Cバス
114
+
115
+
116
+
117
+ /****************************************************************
118
+
119
+ * 関数名:i2c_write
120
+
121
+ * 引数 :ch I2CバスNo(0~2)
122
+
123
+ * slave_addr スレーブアドレス
124
+
125
+ * reg レジスタアドレス
126
+
127
+ * data データ
128
+
129
+ * len 送信byteレングス(1 or 2)
130
+
131
+ * 戻値 :正常 0 異常 -1
132
+
133
+ * 説明 :スレーブデバイスに対し、I2Cライトを行う
134
+
135
+ * データフォーマット:Start, slave_addr(w), reg, data, Stop
136
+
137
+ ****************************************************************/
138
+
139
+ int i2c_write(uint8_t ch, uint8_t slave_addr, uint8_t reg, uint8_t *wdata, uint8_t len)
140
+
141
+ {
142
+
143
+ int ret;
144
+
145
+ if(ch > 2){
146
+
147
+ printf("Invalid ch : %u \r\n", ch);
148
+
149
+ return -1;
150
+
151
+ }
152
+
153
+ /* device mutex Ch bus*/
154
+
155
+ if(pthread_mutex_lock(&dev_mutex[ch]) == 0){
156
+
157
+ /* I2C open */
158
+
159
+ int i2c_fd = i2c_open(ch);
160
+
161
+ if(i2c_fd < 0){
162
+
163
+ printf("I2C write open error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
164
+
165
+ sysinfo.err.bit.state_err = true;
166
+
167
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
168
+
169
+ return -1;
170
+
171
+ }else{}
172
+
173
+ ret = ioctl(i2c_fd, I2C_SLAVE, slave_addr);
174
+
175
+ if(ret<0){
176
+
177
+ printf("I2C write ioctl error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
178
+
179
+ close(i2c_fd);
180
+
181
+ syslog(LOG_ERR, "%s: Can not ioctl addr 0x%02x: %s", __func__, slave_addr, strerror(errno));
182
+
183
+ sysinfo.err.bit.state_err = true;
184
+
185
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
186
+
187
+ return -1;
188
+
189
+ }else{}
190
+
191
+ if(len > I2C_BYTE_MAX){
192
+
193
+ printf("I2C write size over\r\n");
194
+
195
+ close(i2c_fd);
196
+
197
+ syslog(LOG_ERR, "%s: I2C write size over : %u", __func__, len);
198
+
199
+ sysinfo.err.bit.state_err = true;
200
+
201
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
202
+
203
+ return -1;
204
+
205
+ }else{}
206
+
207
+ uint8_t buf[I2C_BYTE_MAX+1] = {0}; //4byte + 1byte(アドレス分)
208
+
209
+ buf[0] = reg; // アドレス設定
210
+
211
+ for(uint8_t i=1, j=0; i<(len+1); i++,j++){
212
+
213
+ buf[i] = wdata[j]; // データ設定
214
+
215
+ }
216
+
217
+ /* write */
218
+
219
+ ret = write(i2c_fd, buf, len+1); //アドレス分レングス++
220
+
221
+ if(ret<0){
222
+
223
+ printf("I2C write write error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
224
+
225
+ close(i2c_fd);
226
+
227
+ sysinfo.err.bit.state_err = true;
228
+
229
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
230
+
231
+ return -1;
232
+
233
+ }else{}
234
+
235
+ /* I2C close */
236
+
237
+ close(i2c_fd);
238
+
239
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
240
+
241
+ }else{
242
+
243
+ printf("%s():device mutex error. I2C Ch%d\r\n", __func__, ch);
244
+
245
+ syslog(LOG_ERR, "%s: device mutex error I2C Ch%d", __func__, ch);
246
+
247
+ return -1;
248
+
249
+ }
250
+
251
+ return 0;
252
+
253
+ }
254
+
255
+ ```
256
+
257
+
258
+
259
+ ### 試したこと
260
+
261
+
262
+
263
+ dev_mutex[0]の様に定数に変更した場合エラーメッセージが消えました。
264
+
265
+
266
+
87
267
  ---
88
268
 
89
269
  2018/10/15 追記
@@ -92,184 +272,12 @@
92
272
 
93
273
  回答ありがとうございました。
94
274
 
275
+ 大変参考になりました。
276
+
277
+
278
+
95
- 原因は分かりませんでしたが、解答に有ったようにgetter関数を用意して回避しようと思います。
279
+ 具体的な原因は分かりませんでしたが、yumetodoさんの解答に有ったようにgetter関数を用意して回避しようと思います。
280
+
281
+ (回避策を提案頂いたのでベストアンサーとさせていただきます。)
96
282
 
97
283
  本日をもって回答を締め切らせていただきます。
98
-
99
-
100
-
101
- ### 発生している問題・エラーメッセージ
102
-
103
-
104
-
105
- ```
106
-
107
- i2c_common.c:113: `dev_mutex' に対する定義されていない参照です
108
-
109
-
110
-
111
- (同様に参照している箇所にも同じエラーが出ます)
112
-
113
- ```
114
-
115
-
116
-
117
- ### 該当のソースコード
118
-
119
-
120
-
121
- ```C
122
-
123
-
124
-
125
- extern pthread_mutex_t dev_mutex[3]; // デバイスアクセス用mutex 0~2 I2Cバス
126
-
127
-
128
-
129
- /****************************************************************
130
-
131
- * 関数名:i2c_write
132
-
133
- * 引数 :ch I2CバスNo(0~2)
134
-
135
- * slave_addr スレーブアドレス
136
-
137
- * reg レジスタアドレス
138
-
139
- * data データ
140
-
141
- * len 送信byteレングス(1 or 2)
142
-
143
- * 戻値 :正常 0 異常 -1
144
-
145
- * 説明 :スレーブデバイスに対し、I2Cライトを行う
146
-
147
- * データフォーマット:Start, slave_addr(w), reg, data, Stop
148
-
149
- ****************************************************************/
150
-
151
- int i2c_write(uint8_t ch, uint8_t slave_addr, uint8_t reg, uint8_t *wdata, uint8_t len)
152
-
153
- {
154
-
155
- int ret;
156
-
157
- if(ch > 2){
158
-
159
- printf("Invalid ch : %u \r\n", ch);
160
-
161
- return -1;
162
-
163
- }
164
-
165
- /* device mutex Ch bus*/
166
-
167
- if(pthread_mutex_lock(&dev_mutex[ch]) == 0){
168
-
169
- /* I2C open */
170
-
171
- int i2c_fd = i2c_open(ch);
172
-
173
- if(i2c_fd < 0){
174
-
175
- printf("I2C write open error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
176
-
177
- sysinfo.err.bit.state_err = true;
178
-
179
- pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
180
-
181
- return -1;
182
-
183
- }else{}
184
-
185
- ret = ioctl(i2c_fd, I2C_SLAVE, slave_addr);
186
-
187
- if(ret<0){
188
-
189
- printf("I2C write ioctl error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
190
-
191
- close(i2c_fd);
192
-
193
- syslog(LOG_ERR, "%s: Can not ioctl addr 0x%02x: %s", __func__, slave_addr, strerror(errno));
194
-
195
- sysinfo.err.bit.state_err = true;
196
-
197
- pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
198
-
199
- return -1;
200
-
201
- }else{}
202
-
203
- if(len > I2C_BYTE_MAX){
204
-
205
- printf("I2C write size over\r\n");
206
-
207
- close(i2c_fd);
208
-
209
- syslog(LOG_ERR, "%s: I2C write size over : %u", __func__, len);
210
-
211
- sysinfo.err.bit.state_err = true;
212
-
213
- pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
214
-
215
- return -1;
216
-
217
- }else{}
218
-
219
- uint8_t buf[I2C_BYTE_MAX+1] = {0}; //4byte + 1byte(アドレス分)
220
-
221
- buf[0] = reg; // アドレス設定
222
-
223
- for(uint8_t i=1, j=0; i<(len+1); i++,j++){
224
-
225
- buf[i] = wdata[j]; // データ設定
226
-
227
- }
228
-
229
- /* write */
230
-
231
- ret = write(i2c_fd, buf, len+1); //アドレス分レングス++
232
-
233
- if(ret<0){
234
-
235
- printf("I2C write write error. ch=%u addr=0x%02x reg=0x%02x \r\n", ch, slave_addr, reg);
236
-
237
- close(i2c_fd);
238
-
239
- sysinfo.err.bit.state_err = true;
240
-
241
- pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
242
-
243
- return -1;
244
-
245
- }else{}
246
-
247
- /* I2C close */
248
-
249
- close(i2c_fd);
250
-
251
- pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
252
-
253
- }else{
254
-
255
- printf("%s():device mutex error. I2C Ch%d\r\n", __func__, ch);
256
-
257
- syslog(LOG_ERR, "%s: device mutex error I2C Ch%d", __func__, ch);
258
-
259
- return -1;
260
-
261
- }
262
-
263
- return 0;
264
-
265
- }
266
-
267
- ```
268
-
269
-
270
-
271
- ### 試したこと
272
-
273
-
274
-
275
- dev_mutex[0]の様に定数に変更した場合エラーメッセージが消えました。

3

追記

2018/10/15 00:14

投稿

FujimuraAkira
FujimuraAkira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -84,6 +84,20 @@
84
84
 
85
85
 
86
86
 
87
+ ---
88
+
89
+ 2018/10/15 追記
90
+
91
+
92
+
93
+ 回答ありがとうございました。
94
+
95
+ 原因は分かりませんでしたが、解答に有ったようにgetter関数を用意して回避しようと思います。
96
+
97
+ 本日をもって回答を締め切らせていただきます。
98
+
99
+
100
+
87
101
  ### 発生している問題・エラーメッセージ
88
102
 
89
103
 

2

dev_mutex 宣言/定義文 追記

2018/10/15 00:03

投稿

FujimuraAkira
FujimuraAkira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -30,6 +30,40 @@
30
30
 
31
31
 
32
32
 
33
+ なお、dev_mutexは別ファイルにグローバル宣言しており、
34
+
35
+ 本ファイル(掲載コードのファイル)の先頭でexternして使用しています。
36
+
37
+
38
+
39
+ main.c(仮称)
40
+
41
+ ```
42
+
43
+ // Global
44
+
45
+ pthread_mutex_t dev_mutex[3];
46
+
47
+
48
+
49
+ ```
50
+
51
+
52
+
53
+ i2c_common.c(掲載コードのファイル)
54
+
55
+ ```
56
+
57
+ extern pthread_mutex_t dev_mutex[3]; // デバイスアクセス用mutex 0~2 I2Cバス
58
+
59
+
60
+
61
+ ```
62
+
63
+
64
+
65
+ コード
66
+
33
67
  質問1
34
68
 
35
69
  添字を定数に変えたらエラーは消えるのですが、納得いかないです。

1

エラー発生点に関する情報追加

2018/10/12 06:21

投稿

FujimuraAkira
FujimuraAkira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,18 @@
18
18
 
19
19
 
20
20
 
21
+
22
+
23
+ if(pthread_mutex_lock(&dev_mutex[ch]) == 0){
24
+
25
+
26
+
27
+ pthread_mutex_unlock(&dev_mutex[ch]); // mutex unlock
28
+
29
+
30
+
31
+
32
+
21
33
  質問1
22
34
 
23
35
  添字を定数に変えたらエラーは消えるのですが、納得いかないです。
@@ -46,6 +58,10 @@
46
58
 
47
59
  i2c_common.c:113: `dev_mutex' に対する定義されていない参照です
48
60
 
61
+
62
+
63
+ (同様に参照している箇所にも同じエラーが出ます)
64
+
49
65
  ```
50
66
 
51
67