|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ J2 E' h! `: E1 _
( I5 B: p) [: i5 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- W: K# C! D- N7 f9 Q% S' e/ s0 ?
#include <unistd.h>
. F4 S& p8 A6 p#include <sys/mman.h>
) ~3 _, M; O1 A& H#include <sys/types.h>
! [/ ?& r; X' u4 O; ^& l& @#include <fcntl.h>
! C4 a' J7 x! @# g
B0 ^. K: N2 Q( i- \! q1 k#define SHAER_RAM_BASE_ADDR (0x80000000) 3 b) U1 b+ n! F: Y5 \( p9 T
; F) D+ X+ F, X" e& ^! _typedef struct e: I3 Y: [, _
{3 Z/ r) ?/ `0 h6 c
unsigned int a;
# ~* e3 m! {4 G, L: H: S& ? unsigned int b;
8 ~ p1 s- w% h4 s4 U! ~; Y unsigned int packet_cout;8 H( h4 `0 l3 Y5 k1 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 `" k% |9 y* t! D7 H/ J1 W
& l$ w8 h. V- B, |4 R* d* ?+ qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 |0 W) g% B" d
unsigned int count_copy = 0;
0 F3 Z. A$ W0 ^7 B8 \2 u8 l8 i% t! m
$ ^& \8 b. ~/ c& q4 ]( g9 K0 R# Z- b! K
int main()) x) U. U: k! t" {% T2 x$ U# n
{
6 Z" X6 i: \2 h* u3 Y2 i' n pRX_MSG_PROTOCOL pshreRAM = NULL;0 N, _9 P" b9 W5 X1 C8 x, Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, O1 q/ s1 T4 ~( d e% P3 r% n) z2 Q: v! S$ h5 m$ j, ? b4 ]
while(1)
4 d% v8 y0 R+ W' y- L {
! u& q1 D7 r }5 V9 b8 j! Y read_MSG_buffer(pshreRAM);3 Q P% ]! X6 Z# a" a& x5 L
} : b' v |5 S+ P) s$ e1 P$ ~; c
}( w \, R' n" e# {$ |* C
* Y* U/ v, E. O0 [0 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ^0 U/ i2 B$ a1 p- _{! m3 X s1 J! |3 v2 h6 R6 k
RX_MSG_PROTOCOL buf;
1 q1 K& d9 t/ Q- N4 q
, d+ b0 G2 e5 [/ N$ t3 P) {" W buf.a = pshreRAM->a;
* W0 ^+ U* o9 |# d' f buf.b = pshreRAM->b;
0 T1 I& z5 \0 {: q% m6 i( s buf.packet_cout = pshreRAM->packet_cout;& u' @0 Z1 {/ @" E- \, K, `
" @. n/ }- {# C9 O/ T5 P
if(buf.packet_cout != count_copy)
5 M8 S. m3 R. T {
( t$ v7 e/ Q7 F' o printf("a is %d\n", buf.a);
( x7 f6 I" b3 e7 R printf("b is %d\n", buf.b);* E( a+ U2 W6 X
printf("count is %d\n", buf.packet_cout);
3 b+ ]0 ~4 t2 f2 [# z count_copy = buf.packet_cout;8 u' T" e! l L7 ]" k9 H
}
/ M, E" [2 p+ o% Z2 w7 I1 f else! H, Z8 q9 J( |
{% \5 K4 M& n+ P, o% t9 v: @
printf("No effective message!");
( K* H/ }4 N8 v }
2 p! q7 h5 {# ^7 Q, Q}
& U6 W% P* P9 }# h
u8 ]0 \4 R# W8 d, X8 A; v. w3 S' g- v( U6 g8 o7 Y7 f, n2 q6 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ n" L# X8 n8 B0 C7 S0 P使用下面代码,对内存使用了mmap函数后:& b& G, q; b" W% }
#include <stdio.h>
0 c; p* p' c9 {6 }#include <unistd.h>( N- p7 C Y6 [8 Q. V b* p
#include <sys/mman.h>- d) X% o' ^( A2 Z8 B* X
#include <sys/types.h>: f, D; F9 h; l$ f5 Q9 Z* R. [
#include <fcntl.h>
$ W4 b$ B; \! ?! ?5 a# t4 r$ h/ y5 W) H' J% g7 g+ Z% l0 I
#define SHAER_RAM_BASE_ADDR (0x80000000)8 N4 L$ D1 Z" t4 U/ e8 J
#define SHAER_RAM_SIZE (0x20000) & p( v6 Q* a) D% n4 d1 |
7 A7 X/ B, w3 Ktypedef struct
" i ^) l$ L! H7 {; j; S5 y7 u{" J" u; g7 K# B' l) R* R3 m
unsigned int a;/ S: m b+ Y$ T! v2 O0 Z1 l& A) g
unsigned int b;! `5 V0 j0 Q0 ^6 ~' L% J" Z4 n2 H
unsigned int packet_cout;& S$ V4 M& z* T# U( w* |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e1 W/ Z+ z8 h& K7 D; A5 h1 P) i/ u9 T3 P; w/ b
void read_MSG_buffer(int *baseaddr);" Z, R: k0 \3 e$ w$ d; `
unsigned int count_copy = 0;4 u/ B. i5 \0 S; K
5 Z1 A7 |$ P; a% n# R, E
int main()5 ?2 |/ b6 `3 t3 i( D H2 P
{" v9 \9 n, y) h- W
int fd;
( t; X1 V7 B- v1 E# |3 t/ ]1 { int *mem = NULL;
- ~3 H ] Q1 A3 z' Y1 J* D5 |/ j+ P0 s7 L
if((fd = open("/dev/mem", O_RDWR)) <0): V. p% O R1 {
{
( U% O- y' z2 a4 y s, r1 I perror("open error");
3 W( J. e8 K% r8 K6 ]# @ A return -1;, v# P5 Y8 `7 j9 Z7 r# i& d9 S5 Q4 Q0 @
}
8 @" i/ U" P0 l9 |$ R 1 @" b4 }; p1 S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 h* H8 Z4 N9 O9 ]5 {: H% w$ s
6 w [- j" |% L0 j2 W while(1)
8 e \1 t" g' @% E }7 q {
6 U7 c0 E3 I+ @" \* l- C read_MSG_buffer(mem);
) g- z. I$ K9 g5 \- \ } ) a1 s# [+ _& `& H8 _
}
$ S& a7 @0 H/ c# B( {, v7 K& \6 m3 ^1 M L( s8 d' O0 x
void read_MSG_buffer(int *baseaddr)
9 x0 l5 \: j: A& i+ n{
2 s* t# W# d+ W8 _ pRX_MSG_PROTOCOL pshreRAM = NULL;, n7 n: a. z# D/ \
$ y) @2 L0 P3 W4 ]+ v9 F7 \9 ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: T( S6 y8 h X4 _! m @
* @) U( Q+ _& O. W
if(pshreRAM->packet_cout != count_copy)
: R/ I, f5 }8 M* _ {9 S# N, w7 d4 m9 m" h; ]: ~ b N
printf("a is %d\n", pshreRAM->a);: r6 z/ D/ @8 Y- d5 Q4 z
printf("b is %d\n", pshreRAM->b);
, `7 A0 Q- [7 I- C& |7 g printf("count is %d\n", pshreRAM->packet_cout);& I' W5 L6 k" C) F& C
count_copy = pshreRAM->packet_cout;: ]& q5 P9 `" @ ^
}
: O# y& y# f, d- I else4 U, c3 y# {; y) M' ], _
{( {/ U# T6 G& F/ r; _
printf("No effective message!\n");& Z1 V3 ]6 p7 M9 ^" G2 ^
}0 H0 _% x4 Y6 y3 J- d% Y
}, j1 Q. Q5 d; s7 M" o, l" @- y
a7 S0 L4 b+ F1 u8 ?3 F: s" |% k0 @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- f; } e2 l" ?. x% l2 s1 `
; Z* n( J3 ^# l/ e3 S* m% D+ F! M4 v6 ]/ H4 z% R
. b' j0 h3 {- D% M. {3 }. H4 U, t3 V E6 U+ @+ S& G
|
|