嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ |0 g2 t7 j. u9 \: Y) L7 X
/ m o. Q9 q" i4 a7 [) t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; U7 j7 x( v4 T! E4 J( {
#include <unistd.h>
/ G4 b. K* B* L8 k! I
#include <sys/mman.h>
% k0 j0 Y7 n4 v" l0 k, S
#include <sys/types.h>
0 o1 g6 N3 N2 \+ k1 ?
#include <fcntl.h>
0 G L$ ?/ Z/ I8 m/ p. I
( c5 p& @5 N5 @5 p9 Y% Q9 p, U
#define SHAER_RAM_BASE_ADDR (0x80000000)
! a' u, W* G. p& n; [$ b2 S0 Z0 b
) G4 S, l \+ \5 n9 g& s! a
typedef struct
( Q W- \7 Y, B! Y! p
{
4 R) d( P/ x6 ]3 H2 P* G, z
unsigned int a;
. j* @& N( q+ B* q! n+ j; H& l
unsigned int b;
& K0 C' P+ f8 |1 S
unsigned int packet_cout;
i) I% A9 h9 P' O' G# ~ ?# j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- s* F, b3 [9 _3 P2 a0 w4 k: c7 K
$ n# s+ Z6 `5 C' _" B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) L0 I& D+ N3 Z$ L
unsigned int count_copy = 0;
' ?' J$ |: l4 P
0 c6 f3 B" a; X. a% _2 o0 U
3 |- [: g$ [* K2 h, R$ I
int main()
; f9 G/ h7 Z) T* K, }
{
. B* ` s' Z) l9 z( i' [
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 [: h9 b; k4 W6 ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Q2 g# T0 @; `
4 p: N5 P V5 v- b& k
while(1)
, D" ]: ?8 K: w8 ~2 F* l0 h
{
/ `) L4 l5 u) d. x
read_MSG_buffer(pshreRAM);
2 ]4 O3 S/ h+ v( I, m$ X
}
: V% q( S6 P5 g% n
}
" Z1 r9 F+ \8 C/ n0 z# x* j
% W. S% _8 R/ x( D/ C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
}4 x2 i( u, ]9 G1 r a
{
% _- b$ g- Y. R; E5 [6 B! x3 d6 z- \
RX_MSG_PROTOCOL buf;
! J7 n4 q: ?" s$ K: X
7 y6 z R/ u. o( a0 X( U
buf.a = pshreRAM->a;
; \# Q5 ]0 I* [" g
buf.b = pshreRAM->b;
" X- P- `6 y7 e( v2 q) o
buf.packet_cout = pshreRAM->packet_cout;
0 J. n" F6 ]% x8 m
4 ^. u1 `) ~' ^4 k f; `; L" N
if(buf.packet_cout != count_copy)
% f5 n4 t& W7 o) M$ F k! _ S
{
% n/ G2 W$ c; t% h9 Y8 p
printf("a is %d\n", buf.a);
4 A: g5 |# P. g/ ^5 F
printf("b is %d\n", buf.b);
1 \2 U! z! j. v; p
printf("count is %d\n", buf.packet_cout);
+ \+ ]. F- `/ d
count_copy = buf.packet_cout;
! U5 q5 z1 `- h( @% L
}
% @) Q$ J2 A Z- t
else
4 M$ P! K9 K/ Q% [% r4 v
{
; G4 {: B5 p" Q3 C H8 o
printf("No effective message!");
# S7 s5 ~3 a8 q5 g
}
4 l0 N) D: N6 U- \* ~
}
: U" X0 O Q( p' R( i
! N* w2 A" c9 o3 |( G& Y% A
. C' h6 O- j/ ~: @! ]& k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I8 h; D# V9 n( H7 y
使用下面代码,对内存使用了mmap函数后:
, s7 p; E. I. \& F8 n6 c
#include <stdio.h>
/ o; c4 Z& Z1 C: a+ `' w( E
#include <unistd.h>
# C! j0 F1 w6 [7 I! V4 @
#include <sys/mman.h>
; e$ \ N1 S8 Z0 k( L! a, b: D( \
#include <sys/types.h>
3 K: x2 r6 t) I: O
#include <fcntl.h>
4 x" e" w& P( P, M
& X9 U6 `6 l4 ]& @
#define SHAER_RAM_BASE_ADDR (0x80000000)
) U' q" O- C7 E" r' S5 r# @' K4 ^( G
#define SHAER_RAM_SIZE (0x20000)
1 H3 ]% M r! k; d" C9 O' I% L
, m0 }7 h, ^) r4 r1 C/ m. u9 [; H: l; ?
typedef struct
) l8 {; G9 S2 u/ w) _) i- J
{
/ r/ @7 T! k% |& Y+ @* c/ x0 n" c0 L2 O, a
unsigned int a;
1 U! i8 {" g: D* Q1 \& f% L6 H
unsigned int b;
6 F# m8 w; H0 g& f0 Y
unsigned int packet_cout;
4 k3 _/ O1 X1 O! y* z! y0 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w' ~4 p6 h0 x8 ?; M4 H% k
3 ]8 C' r) h7 T" B5 U- }8 E5 T
void read_MSG_buffer(int *baseaddr);
! {2 G8 ?' t& q' {! p
unsigned int count_copy = 0;
% ~1 L* I W% W; W S6 {
" `# [3 X6 S7 X9 e
int main()
5 s" A7 p+ G, V/ [5 L* R% `6 T
{
4 w& s; m3 ?- y$ d1 M; o* p
int fd;
; C7 _' r+ h8 [* Q9 c5 M
int *mem = NULL;
( o4 @/ f4 \, R; U) i
* t% O3 y& _6 [! e
if((fd = open("/dev/mem", O_RDWR)) <0)
" H" q0 F# O# e1 {7 v$ L9 M- e- q
{
* X$ D4 I9 E. v# ? G3 d
perror("open error");
; L, C: b5 {- _% k* l
return -1;
& v0 j1 k$ ?- M6 X% J. ^# G
}
5 s. J) ^ x6 h, l3 |7 J
& b- M, v6 j0 V4 u/ F4 x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. s# j1 T/ f/ }
$ w/ k$ `5 B1 c. [/ m/ l) K2 Y6 |6 m7 {
while(1)
' U4 O5 L6 [4 J. a
{
/ l/ C7 ?7 i' v5 S
read_MSG_buffer(mem);
1 U+ Z9 [, |- o& r5 L- t& ?5 o T
}
7 t% j$ Y/ E: j) m0 @
}
g) L# W% c7 _8 g4 \+ l
" `' d( Q( j( ~4 ]; N9 w
void read_MSG_buffer(int *baseaddr)
) h1 \2 l+ S( w4 \: B( ~
{
9 I' X: q% W# G% _8 |
pRX_MSG_PROTOCOL pshreRAM = NULL;
# z. @) }% G' a5 [: H
0 e% k) v- ?$ n/ F: Q3 [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ ~" J C7 V4 f. d
% E' u! k4 v! c( X1 H2 N( S, \, w
if(pshreRAM->packet_cout != count_copy)
- f7 g4 H8 `8 K$ P D
{
4 K9 R6 f9 b8 s7 e, f! A1 V
printf("a is %d\n", pshreRAM->a);
8 |. k+ ]" u3 c* N# V% e9 M- h% ]
printf("b is %d\n", pshreRAM->b);
! c5 H2 N% r; K' e# ^
printf("count is %d\n", pshreRAM->packet_cout);
5 {/ y2 O5 T. M0 l7 j4 g4 \, |
count_copy = pshreRAM->packet_cout;
6 ~7 ]* R. x( }8 E# C9 Q0 s. G
}
, u( X `( h8 Q$ a# b1 d, S
else
4 Y" }4 ^' J `0 C `8 J1 L: G. [
{
, { }$ T) W/ @) s- E' {
printf("No effective message!\n");
& e* s$ B9 ^# e$ [/ Z! g$ @
}
/ S& D. E, F4 L
}
, F# r5 g& o( v6 ?
6 K* s `2 s& ]3 L' e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 G y) Z2 v8 }. Z' M, l2 \3 ]
' u2 \# f3 _+ r( w9 M1 e4 h/ ?
, w$ D( b1 L1 J7 N
- h% e9 ?6 Z1 F& X+ O$ q9 j! K
2 {8 Z( F" W! a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4