嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ]! `! e, j2 n. c$ u* Z
4 D5 l9 W1 f7 e9 N( T3 E* W( O [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 F2 o! f% e4 ?6 v' j |
#include <unistd.h>
4 ^9 U1 H6 b" ?) h$ q/ d
#include <sys/mman.h>
) |, V E6 Q0 ]& n
#include <sys/types.h>
& e3 X" `6 q/ f- a1 G @
#include <fcntl.h>
' ]: V5 M0 Y+ Z& O6 t* V0 ?: w
8 h5 y' m. x# C! _7 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
% S8 p1 l* |" t& i+ g& F1 u
$ _1 {" I. C8 V0 y3 G
typedef struct
# |6 W L, @9 f( B0 D, I! H
{
j4 u$ N0 e: [& Y3 C
unsigned int a;
+ J- F1 A% ^( ?7 w' {* X
unsigned int b;
6 u* K9 r6 P" Z, f
unsigned int packet_cout;
, Z$ A* n8 o% e1 w. S- R2 i6 A ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) ~) V( l+ }3 a! L
$ ^' a4 \5 @' i: \- Y& b5 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 v. k$ }2 U2 d. l9 D
unsigned int count_copy = 0;
2 O. o2 w V! ^7 ], U2 R- @
5 h3 [) q# q& J A+ U: r! n0 d) n
A P- M- D) ]7 v
int main()
& u% E* P+ b* r. Q, b( j
{
0 Q) Y) h- h" S9 t4 H5 `. L" ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
% o: B4 H" m0 b7 k( q) R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 v; T6 W; a) |, z( ], p. D
/ h& b C: c8 n4 r
while(1)
* }, p; m) @' b F1 g/ _
{
) o: N( ^. F7 y0 c2 y( d, w
read_MSG_buffer(pshreRAM);
7 E3 D: @2 F, R0 R- E7 z% \8 P
}
# b+ ~7 Y, E" [% c: K6 [
}
: e% X8 f- \4 g% {3 {9 w9 p
: S6 v# L+ ^! Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ Y3 \# r' g, a5 A4 k
{
4 U; [) N$ ]) P
RX_MSG_PROTOCOL buf;
9 v! `) l8 ?! C2 X: E) c$ {6 W- R
% F% K! y7 A* U; _. \$ W
buf.a = pshreRAM->a;
' X, @% y6 B: g4 u% i
buf.b = pshreRAM->b;
" v9 @- B4 d6 D1 Q# i8 y
buf.packet_cout = pshreRAM->packet_cout;
4 @' W; S ~* D5 L2 U, S
9 Z4 J3 y, A$ _6 k
if(buf.packet_cout != count_copy)
0 [0 P8 z# l9 W" p$ F5 r
{
1 d7 p: r+ W' X9 h, f* u* @) @
printf("a is %d\n", buf.a);
( z8 f$ s1 |0 T. _/ {2 f: @7 g
printf("b is %d\n", buf.b);
' I( e2 T* h3 ^# z# g- Q
printf("count is %d\n", buf.packet_cout);
0 \; E1 }( q4 T
count_copy = buf.packet_cout;
4 k6 c' C: e$ b) s7 ?5 X) j( [
}
( X8 S( _" G- c
else
4 I( J# s& \ j- A
{
7 o" b& @5 M+ L8 U& I0 ]
printf("No effective message!");
( Q: B0 I, W6 u j5 g5 \
}
: D/ I, m# A" j, ]
}
/ e# Z4 n$ \) p: T' ^
, M% m4 X+ s6 y% Z/ A/ e
& s7 Z2 _0 Y- o; P: A. |. N) r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 m6 x4 r1 L/ f/ g& O+ j
使用下面代码,对内存使用了mmap函数后:
4 k" E/ A/ Z% k% x: d
#include <stdio.h>
% u# I Q' w5 z
#include <unistd.h>
3 x0 f6 A2 @5 T% k
#include <sys/mman.h>
- v6 o7 f+ n0 o; y- o% `- {8 R
#include <sys/types.h>
: R9 n3 B% `5 w) V
#include <fcntl.h>
7 d" _+ H) c( h' B& L" |
6 u. {- K+ e4 p! x, A: ~$ b
#define SHAER_RAM_BASE_ADDR (0x80000000)
' n1 l/ n' H0 _, I5 Y; [. J6 ?
#define SHAER_RAM_SIZE (0x20000)
- g# _: i4 ?3 W$ ^( g
3 r9 {7 u- e5 S r
typedef struct
9 l A: |' }, [7 }# ]) B8 S
{
. c2 Y' ~8 M0 ^; Q
unsigned int a;
* s' Q: _3 R- w8 R
unsigned int b;
0 ^: h) s! r3 `
unsigned int packet_cout;
$ V8 d) A5 f! k2 M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 N3 }9 r! o7 {! d2 f' C) b
5 x7 K& |! S; @; h
void read_MSG_buffer(int *baseaddr);
& _$ g; E2 [/ ]( C% C+ R( @7 T2 i2 I
unsigned int count_copy = 0;
F. C% u& v$ w. v
7 D$ T4 g7 L( N7 o7 w
int main()
! C+ E0 m/ G( I* k& @
{
0 A! ^# [8 v, p; }# u6 p4 [0 d) I/ Z
int fd;
5 ^( j, V; {' |" h
int *mem = NULL;
9 n. b t' g. b. h4 i. V7 s2 i# E
5 i+ C5 v" p5 G# a f* T! ` _
if((fd = open("/dev/mem", O_RDWR)) <0)
/ c$ m$ @. g) i7 ]
{
z, k$ P* j1 \1 M
perror("open error");
2 n7 s; L6 z# ]& `# X% D& e
return -1;
1 P, U! y6 F: G5 R
}
6 _" e7 F3 Q, P0 X
- i7 }( P; A( v4 |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, i. ]8 O3 B& |, r- D3 v: d0 p2 a- |
4 Y- H# R6 U+ o9 H& J
while(1)
; | v0 E$ a& }* Z4 a7 d) [2 s
{
" u4 `0 S# [% s# j \+ O
read_MSG_buffer(mem);
; ^0 r* t" j( S! ]6 N+ T2 [# @
}
2 J9 M5 C2 @) U. _) r1 g5 c
}
, b; E( o% ?& Q% p
5 ]/ f. j; O5 B1 ?& ?
void read_MSG_buffer(int *baseaddr)
( l4 D) `# q1 j3 |* k8 s
{
3 p4 k0 t" g4 I: ?/ H% }
pRX_MSG_PROTOCOL pshreRAM = NULL;
# `* S9 ^1 G# E& b: k3 U* T
' X1 m* K* n7 _1 }5 Z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 }* l, D5 _) [0 @& U& O7 Y
`. _- d9 I+ v* K h" J
if(pshreRAM->packet_cout != count_copy)
1 b r7 c& `" _# @' ]6 Y. Z
{
& _' g2 a# _2 {
printf("a is %d\n", pshreRAM->a);
, y& Y* j) k5 `# Q7 A5 z% `; Q; L
printf("b is %d\n", pshreRAM->b);
2 G. D" g4 Y8 f: g+ y( I+ f
printf("count is %d\n", pshreRAM->packet_cout);
' o1 |' r& s( b0 `; J% I5 Q+ C( h3 ?
count_copy = pshreRAM->packet_cout;
2 g9 D- z* t+ {3 \4 ~& x2 R7 J& B: V
}
# t2 @; p" f" H- o" \( {. h, H
else
9 G! j( h, o! D! Q1 q/ S4 K
{
3 e4 p7 q7 G6 y( @9 w
printf("No effective message!\n");
( ^ ^0 f2 ]. ] q- P
}
6 F" m- S- N* k
}
3 `2 S8 _6 M' r+ h( _' q9 u
( X- H9 |( ?: e& k5 c4 G2 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) `1 F& i5 g5 B; m
9 \. N( w: ^/ E5 t; q$ S
4 _* Y$ h7 N3 z0 e8 H
7 s# X' i/ S( u( E( k5 h6 u
' s, H, d4 A# D: w
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4