标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 O) \% T6 Y2 } t% r: W5 H* h% l2 y2 }# H# ]: v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& R- D4 ] x& p$ }, o
#include <unistd.h> ) r; Y6 ~, h. q4 F#include <sys/mman.h> - q b$ J9 _: x& A0 C#include <sys/types.h> : z G0 M& a( c) N9 T9 H* h#include <fcntl.h> \+ X# T- }& Y7 ?0 n; |, ~
; |- u- D3 H% C. G# b7 {
#define SHAER_RAM_BASE_ADDR (0x80000000) 8 J) f) o1 V+ K3 b& O4 S7 ?0 `' u. F
* Z! [* }% |: ]: B* v; Y5 x
typedef struct; V" @, Y% E- s
{ 4 @! K2 v. t+ P3 R8 r( M5 ] g unsigned int a; ) F g4 D, W) O6 d7 y$ l unsigned int b; ) H, z- M3 o1 B8 b. R0 R; d unsigned int packet_cout; - @1 S* `" F7 K7 z9 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; . V% \0 p% j! ^& e; s% W0 ], u- V, w: ~; i& N J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 s( \$ A4 X ]9 C
unsigned int count_copy = 0;. u% f& O5 ~) q; n0 B
; |! f# l4 h) f: }2 w$ R# w9 s. t1 ]4 C8 B4 m; Y4 L. E' p
int main()0 }- d ~$ l9 O8 {% A, e
{4 p, n1 p7 y( r8 \) R9 W) P
pRX_MSG_PROTOCOL pshreRAM = NULL;7 k2 ^# ^" S2 `9 Y A1 s5 B/ z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- P* B: n6 R/ Z) R
8 O! W& ~4 s* Y; e while(1) / X& Y7 K; ?+ }) Q5 Z3 ` {7 j+ b) M, S( G5 m) A+ K
read_MSG_buffer(pshreRAM); $ A O1 n. l5 Q* I; Q6 c# b' z+ D } ' |5 J3 t+ s1 o, e
}3 O; }- I& D; o; V
/ O, P9 i- X( g$ R4 L( d9 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) ; c- B/ K. d7 e5 G3 }$ T0 ~{ % p) B5 P1 z9 [8 r( L% { RX_MSG_PROTOCOL buf;- J4 L! {! F- B* Y$ S
) ]/ W; y: u) C1 ?7 b7 |
buf.a = pshreRAM->a; " u9 K& p$ p2 z ~, j# k7 f% o buf.b = pshreRAM->b;6 d6 E5 I" k& ^) ^. ?
buf.packet_cout = pshreRAM->packet_cout; : M7 n, i' O7 Q' p0 d3 d; d+ i. g 5 L& }: Q+ X j: }2 O' `* x" e
if(buf.packet_cout != count_copy) 2 ~2 t' f R- x1 ]! }& _+ F { ; v v. w& T! _8 J printf("a is %d\n", buf.a);$ C) K0 ~% X- t; `
printf("b is %d\n", buf.b); . D- G3 |+ P. H7 i printf("count is %d\n", buf.packet_cout);& R$ O( O7 C, b4 ^5 @' S' |( S
count_copy = buf.packet_cout;/ ^& Q) U" T$ U3 E5 R/ s
}9 [% S0 Z, d0 `8 O) H+ A( I6 v: N
else % V4 E# E( P2 V5 d {5 F$ G+ O& H- g$ e. R2 {
printf("No effective message!");/ K" k8 E' S2 T) A8 P! X5 [3 U2 m
} ) U# p/ c+ h; x" a& Z" g} + O+ O# ^8 l& q* O1 P7 v2 o ) C* D2 L9 `7 i; I3 z9 Z( _' s# x& `) \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 x S/ K: K( X X( T4 d; X* p
使用下面代码,对内存使用了mmap函数后:' j O+ Y! @" i6 Z
#include <stdio.h>4 i/ O t. U4 Q
#include <unistd.h>: r, @, N# m( {; m
#include <sys/mman.h> , d! e% A+ c8 V. Q#include <sys/types.h> 1 |) B0 m( T; E% M! r1 y) G0 c#include <fcntl.h> ' j& u* J J- @1 i* J5 W# ?* x; C7 g& V/ {
#define SHAER_RAM_BASE_ADDR (0x80000000)( I2 {& p$ O2 R4 A+ T7 n
#define SHAER_RAM_SIZE (0x20000) ! m7 H. o) p( W: E
+ i2 `0 h# o- J3 h' d- G6 Ntypedef struct & v r7 j2 X8 \{ # s- ], r# E" r; d* m! L( a7 D- ^ unsigned int a; 6 @- V! g J4 @5 g' ` unsigned int b; $ F9 k" g w7 q5 z: B3 u unsigned int packet_cout;; f0 N, D3 g/ ^9 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 v. `% n- w+ P7 C% Y" l
1 ^, Y% b6 q2 {! H( ^5 g& E0 ~
void read_MSG_buffer(int *baseaddr);9 w6 F) e) Q4 k/ q0 k
unsigned int count_copy = 0; $ v$ A! W. n5 x: Q3 ~* N2 M1 v* \0 F+ X* D! P9 s5 s8 w
int main()9 X2 Q0 J$ F% O# D# a6 W
{ 1 S, K- k W E) ? int fd;& J* E5 y0 v9 J# I# h4 D
int *mem = NULL;2 C+ @3 X" d3 [! C$ w, o* [
' \7 B, |! [$ m8 U! ]6 Z. x8 W: H if((fd = open("/dev/mem", O_RDWR)) <0)4 J2 B, S: x" I1 n/ Q
{0 q. Y/ K' U# c& }6 S) H
perror("open error"); 4 U$ Z! B5 C% Z return -1; 6 G- T5 `, [: @6 _8 z8 _$ q }! v. M( v! w+ c$ Z% u' M3 n
- F3 z0 `* m- p' e
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ( g# M6 o. T: p# ^4 E3 m' }3 L * Y' T# _: j- V while(1)+ L3 G7 ~9 t( D6 s
{ {5 {( z8 F$ L+ m! `
read_MSG_buffer(mem); 3 |$ P" l1 p+ P* u& b } 2 @( E8 h4 f* ^2 b5 C# i} 2 a8 H$ O. ^/ g* {, n! p- W5 T, H2 e
void read_MSG_buffer(int *baseaddr) & W( S i3 c5 K$ B1 k- L5 N{: L2 g5 n4 J0 y+ e0 o7 @
pRX_MSG_PROTOCOL pshreRAM = NULL;0 f7 B9 q$ }9 l3 _ `. d
2 [$ D0 U& R! h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; ; K0 Z3 L3 t J( L6 r8 h " ^' W a2 F& a9 h* F if(pshreRAM->packet_cout != count_copy) 2 k/ l& G% c+ G4 y% v- Q. d {; N& y$ r8 m: ?' r% U! D4 p9 T' e
printf("a is %d\n", pshreRAM->a);6 N" B6 r7 ^9 T5 e3 v
printf("b is %d\n", pshreRAM->b); i- l7 j3 \: c2 t, p1 o
printf("count is %d\n", pshreRAM->packet_cout); , g+ ]0 Q% l/ p. G. x count_copy = pshreRAM->packet_cout;; ?9 \- A# e+ B7 Q
}2 H- ?- Y+ k$ d8 U( w* g+ T6 f0 J
else 6 |# J9 W) ~) b( ]5 m( G" c1 V; p4 o { 8 |% N n0 H W printf("No effective message!\n");; ^" M+ F7 r; ^* p- r, U7 Y2 f
}- g( E- D1 w# ]. D1 a
}7 w( e* S# k* B- ^6 B* I
9 h" |- s5 I# p5 n/ v( ^7 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? 7 A m" P& F4 ^$ |/ C3 w0 J5 t! h0 w + c1 H! [) E1 U* U- d' \8 q 3 _" j* \; Q! P4 A) U$ I3 x: X8 p1 a' w; u' G: ~9 {+ P8 T