|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 k+ T# E: _9 G+ m- @$ C+ }( z$ ^( R( x. O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 R+ l) g5 `0 @#include <unistd.h>
# o; Y6 v5 y: Z& P#include <sys/mman.h>
3 Y; N4 c: }7 D. Z#include <sys/types.h>
0 T Q, t/ `+ N- x7 z#include <fcntl.h>
! w. U: i8 P0 g% V) a$ M+ q6 Z J
/ X3 w, k j' V5 Y% r#define SHAER_RAM_BASE_ADDR (0x80000000)
% `8 V/ z* y: h M- a- Q! u: t; F' |1 H$ E& I- n/ g
typedef struct
. Z# T1 q/ G8 ^( i{4 G8 U% I, H c0 d( w9 s. E
unsigned int a;. L4 ?$ n, e1 ~9 \! w
unsigned int b;
9 E; K$ x2 J; b2 U& F unsigned int packet_cout;! K: \# C. F/ h# b2 ?& g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& f- |) P( _2 @ `9 y/ j1 _: B
- B: ~! e1 t% O! z" ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ Z2 Q) K( z. Z1 q7 }unsigned int count_copy = 0;' d# U6 X1 [( `5 Z1 `+ |
{+ E: o. m7 w1 Z: E- {8 t* I! B Q
3 u) [; S0 u3 {" `% yint main()
+ b4 L b3 _5 g1 |{
0 o+ {4 L! y r! B6 {: O: c pRX_MSG_PROTOCOL pshreRAM = NULL;! { j5 q% I. Y5 O# K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! A, T+ g* N/ z3 @
; m. I: d, ~$ n& [0 U while(1)3 c8 r0 e+ h5 N& e/ [# @
{
/ J1 i5 p2 \ C* ^. P3 q: T9 W read_MSG_buffer(pshreRAM);
1 D% ^: I# N/ ~3 E }
2 r0 O9 c5 R& u* C2 {# W}8 ` S, P" |* c9 D8 G& D0 ]1 T5 J& _
) K* ^; n' n4 r& g. Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% C: e! q* }' y, }" g
{
. j# n1 J2 S, C" Z3 k8 `2 z RX_MSG_PROTOCOL buf;" [+ R" k: B7 r2 Y, r2 J& s: k- X
$ D! ^/ l# R/ w0 K+ A$ w+ O* ~ buf.a = pshreRAM->a;
1 X( Z& a& y8 t( _$ ]( X8 o$ K buf.b = pshreRAM->b;
, \7 v2 A6 z1 I+ O; n; i2 c buf.packet_cout = pshreRAM->packet_cout;
^) e8 f: ] H5 l( C3 Q7 w4 Z7 a
: f: n+ S: U5 O- q' H' R# _ if(buf.packet_cout != count_copy)
& P( d# S8 T- q; O {& p% M. E Z, E( }
printf("a is %d\n", buf.a);: J; S( i4 w/ _. v# Y/ y2 c
printf("b is %d\n", buf.b);
: }2 W+ e# W8 g9 [ printf("count is %d\n", buf.packet_cout);$ X) e: o3 J0 u2 r, |* G9 n2 @
count_copy = buf.packet_cout;7 a! I z( M+ G) v" h
}
! t. U" y! _+ q3 d, Z# m8 }, l else
u9 B# z1 j8 ^: z) b {; C$ r5 A# H9 G# J
printf("No effective message!");, L+ o1 x7 Z; C5 \ h: S
}% ?* R) s* l/ [( L! O+ z
}; w! z$ D: L4 F; k
( @9 X$ I( w# s9 w' o
* r! Z) t/ l* ?' X: d! v; o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( ?: ?9 [ o1 h& [% d使用下面代码,对内存使用了mmap函数后:
8 A$ t3 t/ l8 S O( \( y#include <stdio.h>7 X2 p& s" ^3 y( U* o4 h5 L A
#include <unistd.h> h, c4 Y4 x8 J$ D2 P% H0 j
#include <sys/mman.h>
5 u# [/ t _* s5 P" Z3 H2 N2 K#include <sys/types.h>0 @( [4 o) F2 `. {/ E3 G
#include <fcntl.h>: }( t# x* V& L$ N% v/ O% l. v
6 u% L% B8 N/ j5 A% w, W#define SHAER_RAM_BASE_ADDR (0x80000000)3 y. w8 t& [9 h6 e2 }0 Z+ s$ r
#define SHAER_RAM_SIZE (0x20000)
" R, V: [0 j( Y0 [* v4 v( ~2 ?' w4 j+ l3 n7 a
typedef struct9 n9 c5 q: O$ o6 q7 Z# H5 {
{# z& s6 t6 C! w! G
unsigned int a;
5 S7 a/ l, Y/ a b6 E unsigned int b;
* J8 n+ w* C$ I: b! r' k. t unsigned int packet_cout;
- g4 q! \, g- Q4 f$ }8 f; s4 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 e3 a0 S# @2 |7 [# w4 U# G1 U
7 _) I: C3 b) R- ~void read_MSG_buffer(int *baseaddr);/ k, v& r8 R0 l' d1 s3 S: i
unsigned int count_copy = 0;
, w* d1 ^1 F" e/ Y+ e. T3 |; N9 Z; G7 J
int main()
' }* j' J: P6 X. s' r9 r{
9 j; N4 G2 ^/ D0 Z int fd;
* V t1 ~/ p0 y# |3 R" G int *mem = NULL;
* z, W4 r" l/ \( d$ @6 c! P" h3 B3 ]
if((fd = open("/dev/mem", O_RDWR)) <0)! g) `6 E j1 h5 i2 |4 n. J. M
{/ W, J Q) |- i6 ^3 a
perror("open error");
! p, Y6 A- `4 ~ return -1;, U. X' A8 M A' z6 x* a
}
C" e. {. S: ?6 K+ O 3 Z( I5 A- J: J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, t% A8 p8 w+ y/ R
4 |8 V2 U5 ~; }) Y( b/ ~! h' ~ while(1)
?" @% M z# |$ |" o+ C {0 H \( O. S: B+ Q! E
read_MSG_buffer(mem);7 h5 \ ]4 s" B
} ( ~! O: W/ U+ B) v
}& L8 `9 @- t- k2 R$ N8 z
; p2 C2 m5 c0 R @1 f) |
void read_MSG_buffer(int *baseaddr)
. i% k) J8 ?, p{
4 c* u6 ~, C a pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m9 U1 R+ I1 {7 h' m! }1 l7 Z
+ r" e% z3 S3 x( d9 ]; t5 @3 K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 I' I! H% i W, X: g$ ^1 Q1 z W+ z0 w: k
if(pshreRAM->packet_cout != count_copy)5 h9 ?, \4 t# P) Q& H/ P
{
" L' K. [! G. X: t7 ?' J, G" u9 S printf("a is %d\n", pshreRAM->a);
4 V/ f: m7 a4 n# I% h8 r printf("b is %d\n", pshreRAM->b);
$ E, p, n* q) i( Q( f% _5 [ printf("count is %d\n", pshreRAM->packet_cout);
! V5 O% M. R+ h count_copy = pshreRAM->packet_cout;
* ^6 D/ W; d/ Z2 V }
4 A- E3 s$ ]3 T. R, R/ J3 f6 c9 j$ ?8 ^ else
- m9 a# ?+ X4 l; O. w4 F1 k0 j2 K {# k3 c' G& ~* E. t
printf("No effective message!\n");1 v' X' S& l |6 q
}
/ A# P! b$ [2 N! A}
, ^$ i+ F/ r. `, F! H1 S5 q' k+ _9 f: T; j/ Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
A' C Z k$ ~- G) x) |6 m0 \9 h1 d
' C' A4 J" o$ |9 X
- m5 e% a' j( s) }' f) f6 K8 C; S* {3 g9 d, q2 C/ b% b
|
|