嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. d% Y5 [3 b9 ^4 _1 a4 z
2 I0 S2 C. M2 u. u; K0 I s. }. K/ h, j1 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ] ]) R) \: L3 M/ ^
#include <unistd.h>
6 e/ q6 Z7 y, }$ w: P9 C
#include <sys/mman.h>
; X' c. W6 J* L6 h# ?/ h
#include <sys/types.h>
1 {8 G% P4 G' l" ^
#include <fcntl.h>
; c, [/ K, G* c% Y
: u& [; [$ @, c$ J2 f# H
#define SHAER_RAM_BASE_ADDR (0x80000000)
! i( c/ i. O& Y/ D3 C% X
* {* b* @4 D. j0 f5 R* W
typedef struct
5 _. E8 \: W" L! q. d8 t+ u4 C6 l
{
1 J& e7 \$ c7 \; r& Z* a& Q# I
unsigned int a;
( {0 t( b+ ~' \& b8 g
unsigned int b;
6 M: F7 v5 M k/ m, b
unsigned int packet_cout;
+ w- N" D P) W* c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, Y7 U' J5 C( e: H: r+ J) ?. O
[* u/ W) }( V# U `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* H# U. g! V) ?. R7 x# [4 R" c
unsigned int count_copy = 0;
' o! `& E9 L7 N- c T1 Z! t
; y. [9 ]8 I9 h5 Z7 r+ ?7 X% @
) T, E4 h$ a' j* H. g
int main()
2 p1 p4 R. R7 r. i
{
- O& a9 B2 X# {/ x
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 p: c0 q/ f! W4 x; \4 q3 b* S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& \ [5 g1 h2 Z3 n9 _! e
2 v# \4 k. e. D1 T+ a( s
while(1)
9 d y1 Q8 j* d6 c( R: S
{
4 i2 i$ p" V, n- S
read_MSG_buffer(pshreRAM);
7 T4 Q+ V* ~; L/ S) Y! t: o
}
* B2 v# T% @9 I) d" R) w }& L
}
- F9 A3 C4 |- f9 r" u
6 [5 C3 B5 I9 M% X- Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! A! }5 e* P5 W& I4 H8 g
{
, u& ]" q( i4 F$ l
RX_MSG_PROTOCOL buf;
# A/ }3 B' ]+ e8 x
/ ~6 f% d$ A# x1 ~
buf.a = pshreRAM->a;
: C$ E1 g' ?5 n( y4 C. H, {& x
buf.b = pshreRAM->b;
7 K7 _, Z. q0 p# I1 |8 X* c5 l
buf.packet_cout = pshreRAM->packet_cout;
. d6 G* ]# U# y( p+ T) N2 U! u
5 h- j% |# u/ O4 i, ?$ O# D
if(buf.packet_cout != count_copy)
% U0 Q3 m/ _" d- D s/ R
{
# P5 P% X. v/ v9 B& g
printf("a is %d\n", buf.a);
! F& ~* x4 {. @/ N
printf("b is %d\n", buf.b);
9 q$ g$ N7 r3 j- D' O6 e
printf("count is %d\n", buf.packet_cout);
# H" z" n# q' P I* \
count_copy = buf.packet_cout;
% {( \; Q6 a U" }' A' ~; u5 l
}
; n, W/ x1 x1 L- J
else
+ m, c: j# K: a* z
{
3 B# W8 A: H) X+ B8 f
printf("No effective message!");
2 `; V2 \3 E* s: l; i9 }9 }2 {
}
( f; h5 r w7 e4 ]/ U
}
$ ^2 T! B7 f2 K+ t- Z
, Q2 g* [0 t" c8 n& a- q" s
' |: N, E$ k; F" m: h1 Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 z8 I4 x6 J2 H; G; x$ ?
使用下面代码,对内存使用了mmap函数后:
% n% t. f$ k. A7 U/ W1 a3 ]
#include <stdio.h>
( u" O, o1 q/ L
#include <unistd.h>
; W( n/ i5 e; I. u% G
#include <sys/mman.h>
6 L. C. Y# ]9 L/ |8 e" G9 p
#include <sys/types.h>
: j: q- @ P" _% z
#include <fcntl.h>
$ @4 l1 q" p- e3 D' Q
" S6 d( [ B! C3 Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 [. y5 w& r' S* O2 r
#define SHAER_RAM_SIZE (0x20000)
9 h$ Z+ ^0 _. Y: J: V& @
, U, A+ b! n! o3 A2 X
typedef struct
) V: ^1 ]2 m# f/ D0 |
{
5 J+ K; a7 s( M* m
unsigned int a;
x! ]: a! X# g4 n
unsigned int b;
5 q) [. c$ a# _* y: [2 ]
unsigned int packet_cout;
! z+ c7 L$ Q+ J4 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! x5 c4 l8 c! n% R
: N4 y$ G+ w1 H8 e3 T
void read_MSG_buffer(int *baseaddr);
7 @6 F+ R. z3 ~
unsigned int count_copy = 0;
5 ^1 J9 {) ?( n. P
4 X# U" t" ^$ M/ }. L9 z8 i4 o) e
int main()
4 F5 p' Z4 X/ O4 m4 m- [5 x
{
4 x* \! M3 w: c a: X
int fd;
$ l m$ s5 N; e* I
int *mem = NULL;
+ [* q x9 e7 D# X7 E, ~
" U+ D& x$ c( B+ u. s- T
if((fd = open("/dev/mem", O_RDWR)) <0)
1 S2 j# X% j+ l' i% C' e6 o6 R
{
& t; b+ c I3 I* f
perror("open error");
; X( u) H! z/ k' [* {
return -1;
. {% o+ @9 |4 e- ~
}
. e6 K @& H) X3 N7 r1 E
5 b# E* U: a) n$ R% c; g! [: Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. b4 F9 v4 |* ?- v. s
. A1 g4 h6 V5 p( O8 `& b
while(1)
8 n0 B! w' _1 m7 J
{
- b4 g1 n7 u" V1 r1 |. ~ g
read_MSG_buffer(mem);
7 T; u& a2 X! w! W* a4 Q
}
+ s# ]) M+ |, U5 Q- R- V9 \1 a+ a
}
4 a# [5 A3 t8 ^0 H
6 w, R; v% A5 a0 H+ }. ]
void read_MSG_buffer(int *baseaddr)
+ J( d6 S. p9 _, L; b! z+ P9 Q) |
{
" l! V e5 |& j. i5 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ U8 A$ o1 _/ N. E1 f' w9 c
1 Q' g8 j+ e% w; o- k8 U5 U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 ~1 R3 L* Z- d
! i( B; K% |& E" k% S5 u: d
if(pshreRAM->packet_cout != count_copy)
( D$ Z1 |( E* }6 d7 b/ w6 o
{
! n3 n0 l! S4 x8 H
printf("a is %d\n", pshreRAM->a);
2 i+ v6 x) H% V5 ]9 w$ r* I$ b! P- J
printf("b is %d\n", pshreRAM->b);
% }; j/ n+ z! D9 E+ c9 }
printf("count is %d\n", pshreRAM->packet_cout);
+ C+ h8 `* r0 P0 \( W
count_copy = pshreRAM->packet_cout;
( b+ i7 P) u+ i$ U4 L+ P2 Z9 [: R2 q
}
Z1 V9 h7 E$ W% }
else
3 \+ ~0 D/ s7 W3 H3 f- }; ` J
{
+ B5 @% y4 h1 b
printf("No effective message!\n");
) r8 N& H3 Q5 E* z9 k
}
7 d u9 j8 O7 m( E, c
}
$ ~( j/ B( H1 ~5 \; S. w
# Q6 m( j, `* C. V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
Q1 a; Z G/ {+ K: Q* v% _
& ~$ y% J5 \- O; n1 A Z
( ?# ?1 i) i. m- f. C
7 ?- z$ \4 k6 A' ]3 p4 d& O
6 \7 K. K8 P) u0 a6 z+ X5 t
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4