|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, I$ A, P* x; ~% k( l+ z4 q _1 I4 J& [' f( f' j6 q# K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* p) L r) v& Q8 v' h2 N9 b2 L! L
#include <unistd.h>+ }2 r) f% V# x- T4 H# ~# h
#include <sys/mman.h>
0 N: [/ ?( ]' G% w/ [( f* {#include <sys/types.h>
9 |5 _7 p$ C+ o( F$ p#include <fcntl.h>! \. }, p0 Q. q( v" \
* U* e, r4 r! c* Z/ g }; M#define SHAER_RAM_BASE_ADDR (0x80000000)
5 \4 y' }% c- a- [3 J- S. c
/ ]$ T3 D/ l7 j. ]# W% ltypedef struct1 f' F |) {$ Z' y
{5 L5 S* b: Z+ N
unsigned int a;
" Y, s# ]4 B0 q# @3 I- { W unsigned int b;" s5 M; t) Z' f/ \
unsigned int packet_cout;
; x; p) A6 D$ w: w9 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 ]) b3 h3 V( p! r! ]7 d
. J! r0 {0 E! E1 }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 [2 _2 E0 p w, X& Zunsigned int count_copy = 0;
) A. `7 {# H) z2 [; E
, z4 N8 V6 T# W( `. C/ Z6 h* ?* p0 t$ `; b' L
int main()
% {0 T* R& d/ C8 P! r8 l6 w{
S4 f8 f R' L. \1 }1 x- W pRX_MSG_PROTOCOL pshreRAM = NULL; @& @* b0 S, `; z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% @: k% @* o$ M/ C4 C
4 K& L( J% j: R! Z5 j9 b while(1)
1 g6 Y6 G5 z- C! f3 x2 g {5 x4 E" {4 N3 j2 F! x: d
read_MSG_buffer(pshreRAM);3 |: {! J1 Y7 t1 f5 ?: h# |
}
* o5 V( V* f: }) r, `( [}; Q; r: Q+ Z4 U8 ]0 d
' U% D# O* \2 X, q2 x9 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% R2 d( v% n3 U{
. T2 `( N+ N- m& Q9 X" F! A RX_MSG_PROTOCOL buf;; o* x4 G1 y% T6 Y
( i# {3 C" W, |3 S* W$ j
buf.a = pshreRAM->a;
, ~6 I+ y- t+ W1 b9 y buf.b = pshreRAM->b;
5 K. _+ g* a- W* _ buf.packet_cout = pshreRAM->packet_cout;
* d0 ^$ _2 X9 v8 L5 ` ^" e1 ~9 P, L - V* P$ y+ ~# p" m
if(buf.packet_cout != count_copy)* {) z1 W" k& Q; F8 q4 e$ T
{
1 E7 _: p, V2 o printf("a is %d\n", buf.a);3 H# _" G7 {: l; S4 K
printf("b is %d\n", buf.b);
8 ~% ]3 o) W- q( i* u, a8 O7 m# W, m printf("count is %d\n", buf.packet_cout);8 W, ~) Z6 ~; D1 O4 p
count_copy = buf.packet_cout;
. m; o6 E( ~( d }
, w7 Q0 V, r$ G- c% Y! V) E# y, G$ P else
( Q4 i2 ^4 b6 l4 l {% G0 A' ]1 Q' X e# Q q+ b
printf("No effective message!");
. V0 F3 h: g8 {2 y3 V$ T }4 ^& ^0 b' S" F7 v
}
b8 C( E* ~( [& S7 g+ |% V
7 ~! Y. A" j7 j
! f5 t' {7 @4 J* d2 E6 y* Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 r7 C% y2 g7 ]% P3 ?8 D使用下面代码,对内存使用了mmap函数后:
! K, ?, B3 e+ N% r#include <stdio.h>! g% o, g2 j( l0 O' p
#include <unistd.h>
3 {5 e# `8 t. i+ ^/ k#include <sys/mman.h>
3 p( e9 h9 ?* T3 @+ x, W#include <sys/types.h>0 h5 F* m0 p( H& H) i2 [
#include <fcntl.h>
: h q( ^( ~% r' R" v8 G
3 z9 q8 D9 S6 L# ~#define SHAER_RAM_BASE_ADDR (0x80000000)$ U9 J$ S$ M! r
#define SHAER_RAM_SIZE (0x20000)
5 W# ~% X2 k9 ?4 p" H7 H2 ^; r1 G" x" I' ?. {. x! ?
typedef struct
/ e* F* T' Y4 x4 ^{1 |' l8 ]1 x. L# _; q! [4 p' M
unsigned int a;
5 @6 @ s+ z- N unsigned int b;
' H6 Y( v- \) o; @& w) b unsigned int packet_cout;4 F* h1 }3 A* s, M5 r" i# q" W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: |, D: M6 N2 S' a5 l
4 b3 c" q! W5 h7 |void read_MSG_buffer(int *baseaddr);
5 Y9 N- d2 B) D3 N6 a6 j2 aunsigned int count_copy = 0;( P# y. ^$ ?: W Q. J% [) [( R; r
# T/ k7 u+ F. u- D x: k yint main(). L9 B) ^6 w: B0 ^0 d
{3 a/ s4 t; T; ]$ O, A/ a4 g* r+ a
int fd;
" y" q9 b8 R# G1 U2 r int *mem = NULL;
' N1 y0 T( F& E% n% B+ n+ _: I! z: c0 M# b
if((fd = open("/dev/mem", O_RDWR)) <0)
" K) I9 F. T: ~& k {
. f6 [+ q) d: h5 {% s perror("open error");
: f+ ~$ H2 G d return -1;
5 f: w3 {; n* x% l) N }
5 S9 Q5 i1 k4 i4 s: [" z/ i
# Q" i' z( e+ |6 X, n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 B1 B6 A, [, u1 W0 f$ l2 f S
: q: F0 @6 G6 ?; i' r: _
while(1)2 c3 E4 w, N5 E# J
{6 H# h" D8 q2 K) K
read_MSG_buffer(mem);
8 U5 }0 u% M" n6 D1 f- o } K+ R6 w" M$ I+ n! W. O
} X+ H P6 J3 f& R
2 S# ]1 f! `. S, R- h) \+ B& a% [void read_MSG_buffer(int *baseaddr)
( R |* B2 c0 i. B4 M{9 Y5 ^8 v, j; n
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f3 S, U. b( L/ b9 v8 |3 V4 B G* e6 X! `% J9 f1 L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% J# Y0 b! y( T$ F$ F8 Z! D. A, w" ^; A4 q( U
if(pshreRAM->packet_cout != count_copy)
/ B: @# @& j9 }! H9 L {, S5 X; V! v f( \2 v
printf("a is %d\n", pshreRAM->a);
* g4 B0 n4 M0 v" S6 q. G printf("b is %d\n", pshreRAM->b);
& G2 |( G* a9 L" i0 W8 H \8 z2 \ printf("count is %d\n", pshreRAM->packet_cout);
* H2 W* ^9 u& @! ?- Z: H A count_copy = pshreRAM->packet_cout;% D8 c6 M0 X9 P/ h8 h. `$ a
}' O" ]* Y+ t& O. Q* Z- U5 Z8 u4 L
else: F% k5 ?, s" _. Y8 K
{2 M% b9 Z' {& j. h3 k, b: A# c
printf("No effective message!\n");. d5 c9 T& r7 g1 } j
}/ m) e8 q5 Z2 X5 z
}& M Y7 c$ _ A( |8 |% K
2 N4 M0 C+ ?% g+ c4 f0 E7 A! l! o5 p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! n9 G) e8 m! S& h, y
. v( L- {1 m/ z$ x$ u+ ?2 Y" J0 d0 u/ F( G
% e. t0 o# B3 C4 x* H$ l
- e! |8 u" |* {! _4 o6 ~; p7 A7 H
|
|