标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 T# R2 t# T6 B3 F4 ^ ! e* T% U! e, y, {$ oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> . M" V" u, x1 F2 C; N' m#include <unistd.h> , m8 d1 s( N5 \4 ^#include <sys/mman.h> * B8 I6 d, a+ F3 U' l: B#include <sys/types.h> 4 f- h+ W2 L; c; t8 u$ z#include <fcntl.h> , J) [, O3 T$ s+ s) c0 i7 f5 ~/ w- d& l/ c
#define SHAER_RAM_BASE_ADDR (0x80000000) : i: z6 V& Q, \8 J; C$ e7 \. r2 E4 c$ |2 h! {
typedef struct( R1 E, N9 r3 s" {
{ / e" {- V1 r% v( z, J; ~. V4 g3 h unsigned int a; o0 l$ ?1 w5 c( p6 }) R5 F2 l
unsigned int b;2 F7 s# ]8 O- D2 U
unsigned int packet_cout;! F, E& w/ P$ F6 }/ C; f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ y7 N% w- y' |
) [$ }5 j' y# n9 T2 d R* U1 B# ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 M" q% {9 A& V' _5 b0 d7 e
unsigned int count_copy = 0;8 j9 f* U) |7 T3 Y, x% _
+ P# j& b$ x9 b0 ^
p0 n Q. i4 J; @0 A
int main()/ T% f! M9 d) n9 [6 K" Q
{! C: S+ K1 |7 B+ {
pRX_MSG_PROTOCOL pshreRAM = NULL; 7 C3 X+ D; ]" S! b! }. J1 O pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; ( Y7 G+ d. y( [3 z! P* F! S- N X/ E' w4 U: p
while(1)' z6 p! r, n: s& J- ?
{ : C* n7 Q5 p5 p6 l' t read_MSG_buffer(pshreRAM); ' j* G7 y8 U: L' o& Y: F/ G) s! p } ) E5 M8 |# W" I3 Z+ p0 ~
}& y! u& S# @9 o
! J% T4 ]5 _+ |# F7 _& k; X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) ' V+ T0 j) C6 z{, K6 l7 S8 J N
RX_MSG_PROTOCOL buf;+ [: S& D% f5 y9 a% X# K* R
% d7 ]# l7 S* V
buf.a = pshreRAM->a;$ h) X5 C3 H9 _, n1 d! [9 ^3 F
buf.b = pshreRAM->b; 4 z5 G8 M; @$ h5 ?& E! t buf.packet_cout = pshreRAM->packet_cout;7 ^- E7 l! s% S7 f6 k
8 D: ]6 _& \$ z3 q: m7 e! |/ c
if(buf.packet_cout != count_copy)* r6 A$ J1 Y$ h! f1 a- M) P* ]
{- U+ X" z( e2 o3 q9 }. O
printf("a is %d\n", buf.a); 2 Y1 O' `% y, z printf("b is %d\n", buf.b);' _: V7 Y$ Q* E" l
printf("count is %d\n", buf.packet_cout);+ q; n1 y( n" ], U! p) t
count_copy = buf.packet_cout; & G) j) V3 S3 ?. Y) Z! q6 { } - R1 ^. x3 r% V3 B: u2 d2 t else6 K2 `& W5 M, E" m8 {* s
{9 ]# c7 @* X6 | v* k4 w2 c
printf("No effective message!"); 1 q$ X7 b: ~# s; v" y9 K2 l }& f' t# @0 g I: V
}+ y: A5 u% N" R6 S2 ^ q
& `( ~. z) q0 y: @1 C- [5 E5 e2 N# R/ X0 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 & |& |5 C6 k$ R# j5 y使用下面代码,对内存使用了mmap函数后:, z) P% Q- {( r6 N) v. W9 c
#include <stdio.h>2 m1 W, l L1 Y6 T4 S7 P/ j
#include <unistd.h>! g' c' A% F! O( C
#include <sys/mman.h>4 Y/ p/ {# X/ A- c
#include <sys/types.h>* s6 c( V" K; p7 F m2 }2 M
#include <fcntl.h>* Y4 W2 } G5 b% S6 ~! y; D
$ V$ C: i9 A0 r E; n6 d#define SHAER_RAM_BASE_ADDR (0x80000000)6 \7 i0 K F7 l! ~+ `( U
#define SHAER_RAM_SIZE (0x20000) * e9 u* @/ C" H9 B5 J! f4 o5 Z+ Y , s$ K) x5 T: L% ^+ Ftypedef struct . A) P o7 f# v7 f{ ( L0 A) y+ W* A unsigned int a;: p8 }2 O0 e. F1 O& L6 E
unsigned int b;8 I' i1 Q4 E, T
unsigned int packet_cout; . H- D4 k: K* G: S' D; b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; ^1 s+ c; y% Y
- J: i4 Y5 m! Y, n, c
void read_MSG_buffer(int *baseaddr); 9 ]$ @1 | p6 ~( p h( i8 u$ junsigned int count_copy = 0;* {- O' H& D& @3 K% D h0 |' g
0 j2 f1 r' [1 v: G& e6 I) n& [int main() ) G/ Z( L0 r8 f% W1 P0 \7 n{1 u; t% V7 o# [1 N5 |/ R4 J
int fd; : m* q2 p2 Q. T- z4 U; t7 k7 ~ int *mem = NULL; : U: H" }) h6 Y( e5 v& P 3 {1 h4 H5 T9 o ^3 c1 D: y if((fd = open("/dev/mem", O_RDWR)) <0)! K+ }. C9 m1 A$ m3 R2 [* Q. X4 n: b
{ 5 }( e* ~4 o6 A% i" Q9 l perror("open error"); % ~! r1 B5 n6 A- X4 v. q6 K: V return -1;# O5 w" {! P/ n! `5 E. r
}( t( K9 c+ N: t) I5 V
8 D- S( N% D% | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; f. H* P. v) @7 P1 O) ?! x
5 Y8 g$ G4 e: N while(1)6 \* q. L5 L6 p" j! X& z9 U
{! _: z- q( Z5 B, T& E9 M6 o
read_MSG_buffer(mem); % E+ f' z, C; N$ I, @* ] } * d) d, P5 \0 T. j1 B T} " d" _9 v3 H) M- o' U $ T* r; p. U1 p" s& o5 S+ w0 M6 Gvoid read_MSG_buffer(int *baseaddr) % [$ W8 j" u! G3 F{ 0 X2 ^ H7 W' U. |6 l pRX_MSG_PROTOCOL pshreRAM = NULL; ; |1 t, \5 h9 b" N4 P1 z4 n9 A) s/ \. {: d4 H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; 6 j, R# f# ~) e6 a" l( t2 n2 I& G0 [& f4 p
if(pshreRAM->packet_cout != count_copy)! E( N( `6 a3 b( Q- H
{6 q& w( Z4 f6 Y5 `3 z7 E! o
printf("a is %d\n", pshreRAM->a); ( D S$ ~- u" `8 W0 x5 q b0 u& N printf("b is %d\n", pshreRAM->b); 6 c7 Y, q0 _7 M: |! Z* P( W$ u printf("count is %d\n", pshreRAM->packet_cout);9 j( `7 @4 O% q
count_copy = pshreRAM->packet_cout;7 N9 d7 P, q$ z1 u, R8 j
} ' U( _. u# D, m! T j+ {# g5 m else : ?3 d1 @$ ]- }1 p. O( B { U7 |4 [' b( d; C$ e printf("No effective message!\n");0 C8 f D5 K% D6 T/ n
}1 Z1 \8 q1 a' P. r
} ! S: ^: J0 l) k4 x5 X( }- P8 |$ `/ x4 C4 X8 l8 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? 1 @2 U+ `2 o1 A/ c) G1 C* ?* N( x* m* R" v. S* ~; {# x
v4 W+ ?* q r0 U( r; V* D% U
/ W. |6 q, n: q4 q! G' j