| 
 | 
 
 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑  
( [, G4 ~8 d- M/ z9 i* B7 d/ ]! v 
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> 
' h# e: r: T, o# g$ x; b#include <unistd.h>3 ^. n3 G- [6 q- i* P# i' ] 
#include <sys/mman.h>8 d4 t# y6 Z! O+ z 
#include <sys/types.h>5 I% q8 S& c. a 
#include <fcntl.h> 
2 N4 _( p/ z" B9 c6 D0 Y- @ 
, m* p/ ?: J& i#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 n8 n( ~( h5 h 
3 g+ D3 E! s! v( c. l 
typedef struct 
# ^) h9 I/ ^, K# ]  J* y{) M6 {3 S! b& m  p( W 
        unsigned int a; 
$ }( b/ R+ D% u        unsigned int b; 
# D& i, R& o  q: L9 K7 I        unsigned int packet_cout;; e% v8 e2 ?8 n' D1 t/ P# A5 {' R 
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; 
0 y: D+ {1 D4 G! [$ v" M: \9 r 
7 l9 ]; E+ X# `; C# A/ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); 
' X- R8 `+ ^7 c  t8 Q. _- d6 ^8 ?+ iunsigned int count_copy = 0;. j" Z) A% R( p6 u; ]  ~7 p 
 
0 Y& \! k! B/ s6 W 
* O+ i' E& a- y# Kint main(): q- g; c1 r6 A( H; f0 `) N 
{. K9 i% l: B7 t' f; G 
        pRX_MSG_PROTOCOL pshreRAM = NULL; 
  S" T, G8 B! R        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 I' w+ |3 ]' h4 D8 P8 m' B 
 
4 R  G8 g4 S3 s+ e8 b1 s, ^' K        while(1); l3 [" O, e( `  m( O6 i 
        { 
$ @- e* j3 U# O7 F                read_MSG_buffer(pshreRAM);7 |; g1 [1 u0 S8 E# }, i9 ? 
        }                * I" N+ _: r, a) X% K- O  x- Q 
}* ?3 j3 B, ]* ^: |& Z* R/ i& q- c1 D 
 
! n9 x5 q: Q. G, v; _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) 
3 Q$ E1 u- I7 N6 F{, f  d8 o. M2 H$ L! e2 [  n 
        RX_MSG_PROTOCOL buf;' k9 T1 F2 P* Z2 \8 t* \ 
         
2 e* E7 ~6 T  u) Q: X        buf.a = pshreRAM->a; 
3 U1 K5 N* y- a, M        buf.b = pshreRAM->b;; |% G# c1 p, N7 g( c 
        buf.packet_cout = pshreRAM->packet_cout;  S9 @( l( @+ [- F 
        3 D' O. ~6 y* V9 ~( k 
        if(buf.packet_cout != count_copy)' t6 H3 Z1 L3 X 
        {6 S1 k- k* U3 U 
                printf("a is %d\n", buf.a); 
; z1 Y3 h, O* y0 T                printf("b is %d\n", buf.b);  V) V2 Q3 G# l# U/ N3 j0 T 
                printf("count is %d\n", buf.packet_cout);9 Y( }5 h6 B7 P7 W+ K: _ 
                count_copy = buf.packet_cout; 
' ^  g* ]4 Y* k, g        }1 l. u4 a: v( L; o 
        else% z4 S( Q& |! w4 O) T 
        { 
! Y  I" T5 }2 p  z. a& d                printf("No effective message!"); 
& [! b# O" s2 C9 Z: Q        } 
0 d( o: x; m9 ]5 n/ m" ~} 
7 T0 p3 `6 D9 ~( H0 Z% ] 
5 z6 N; D* U9 [6 w0 z 
: f3 }& k0 t+ n0 t; g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- l3 q/ H+ I) v4 x- H 
使用下面代码,对内存使用了mmap函数后:8 b' w) B% g8 ^% h# j: |9 j 
#include <stdio.h>! y; v, ~( B* z$ H 
#include <unistd.h> 
6 `( }  U% m% |5 G2 R3 {#include <sys/mman.h> 
9 E& e" Z2 f/ {7 O#include <sys/types.h>- r% `) L) s: R3 }. e 
#include <fcntl.h> 
' `. R% z6 f7 q, p7 c% z/ T: ~( p9 v 
5 Z9 m: K8 I. t1 w9 x4 \/ C#define SHAER_RAM_BASE_ADDR    (0x80000000)7 P. e9 ?" ^- r; d& Z 
#define SHAER_RAM_SIZE         (0x20000)    
9 ]/ U5 w; S! N/ J( u, l$ F' t$ L/ _! ] 
typedef struct 
/ O( T, s( q* m% f' c. U: q+ i{ 
1 J0 r. ]( V- W( x+ l        unsigned int a; 
- ]7 y# [) ]9 [        unsigned int b; 
  t5 y# W4 o5 ^        unsigned int packet_cout;  K3 F4 W+ q4 z# F* u( G 
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  @  g4 ^! Q; C, z6 V( P, I 
 
3 j  X8 d1 }2 E" {9 n0 r2 l2 Xvoid read_MSG_buffer(int *baseaddr); 
  I" y- A  y  W: iunsigned int count_copy = 0; 
5 T/ A; I5 }  |. Y. c+ v. a; [6 t2 R: U 
int main(): Q3 n5 p: O5 V% [& r+ C 
{+ D1 d8 w% I- ~# E- M7 R$ D+ y 
        int fd;# A3 w% [1 o8 \8 q1 u7 \ 
        int *mem = NULL; 
. j6 Q1 [* C+ d" M0 w7 h3 B: e% R6 j, } 
        if((fd = open("/dev/mem", O_RDWR)) <0) 
) r4 O  ^0 ~/ D        {) ^5 W+ D% a# ?. j* R 
                perror("open error");4 N" M" R' M, t, P. g 
                return -1; 
" `! ?7 N+ j. y6 k+ @        }/ y$ l# I5 f- v; ?/ V0 p- c1 X 
        7 J. |: A  `! K4 b& X" { 
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 a  D" u: U! P/ G. g+ W 
 
6 [7 x3 i4 k7 _* W9 a3 D8 u        while(1) 
2 ]% ~- Q; a2 i" Q. K! q) }/ ~        {+ h1 f7 F" D5 u( k( C! Y( z  g 
                read_MSG_buffer(mem); 
9 Q2 \$ B; W; q" U        }                4 `+ O$ }0 g/ ~( ]- B$ A 
}6 M6 C' `6 h" v, C" c9 @: S 
: S1 d: v3 N& p6 b# `8 h 
void read_MSG_buffer(int *baseaddr)# O/ z0 F" i" }/ b* W8 H9 g; u" E 
{$ {0 J! \/ O2 B& b0 ^ 
        pRX_MSG_PROTOCOL pshreRAM = NULL; 
' X9 v% c1 l6 w 
( O0 n* \! w! `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; 
' `# {7 R% x9 p2 k# V& P2 {; K 
8 P6 x- a' [. `( O        if(pshreRAM->packet_cout != count_copy) 
9 B( Q3 C7 \& \+ u6 O  G5 {        { 
: {; ~2 p6 [& i                printf("a is %d\n", pshreRAM->a);6 C2 \. d9 j7 `! P" l) s% q+ h- Y  X 
                printf("b is %d\n", pshreRAM->b);' ^. V. w1 }- W! U  T- \ 
                printf("count is %d\n", pshreRAM->packet_cout);5 O1 A$ k  c5 ~7 v( F0 ^4 Y 
                count_copy = pshreRAM->packet_cout; 
; l( r/ p) e5 A+ y' Z        } 
$ D. }. `2 C7 ]( X/ R        else 
; i+ [. t4 z! p! E8 P        {7 {4 M+ [2 y; o7 W/ l$ J 
                printf("No effective message!\n");1 s5 e, T* a5 E# U/ C* D# ? 
        } 
2 o! o5 b) A$ }0 a) o} 
+ M/ _; x4 ~. P 
5 B- X7 F: E& o; C/ j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  N+ a) a$ Y- Z) _1 P; a( [# E 
 
/ G% i) w* q& k/ {6 {6 x; Z5 [. f  k  B9 X9 \ 
6 w9 w8 X% h) q1 ]* _ 
( N0 ~: ?8 b2 B% t( ~ 
 |   
 
 
 
 |