|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 ~9 D/ I: V; r9 ~& }* G9 W
. ?5 {# B) D+ H5 R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; `! D, c% U e/ L6 O# w5 O#include <unistd.h>
8 c1 {) v( M; D#include <sys/mman.h>
" x5 z6 E: o: v2 i#include <sys/types.h>
, }( y9 l6 K5 Y/ B. A" V#include <fcntl.h>
+ D+ f- i- Z' A& ^' m$ E) n2 _! U( h: O$ ^$ Z
#define SHAER_RAM_BASE_ADDR (0x80000000) : s' @8 U7 ^! p9 i7 o
1 t1 _5 A4 }8 p, c: B
typedef struct3 x5 J9 z/ M3 I1 h( D
{' C5 @# a8 X7 S
unsigned int a;, d8 b% s: Q' \ R# o! U& X: M8 A0 y
unsigned int b;6 a3 m r" B* G8 Y
unsigned int packet_cout;
9 y* { V2 C9 n2 D' l# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 C0 m5 O& ~ t( G; e4 ?8 u2 R9 b7 z
: T1 j6 }$ ~, f0 z0 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 l" c4 U. T [" E0 N7 j8 @unsigned int count_copy = 0;" B9 G; y! d/ R8 q; B. M
/ H' N0 B" B. m6 F
8 ]5 L6 Y5 }3 k# X
int main()
4 T/ P# A3 a5 B3 j6 A! n{
# T" b" B7 ]5 U0 l4 D/ X* B- \ pRX_MSG_PROTOCOL pshreRAM = NULL;
: |) ?* E/ p! o5 _0 j pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( F6 B& L" U _% Y1 x/ ?! H
, E# n% g9 r) s6 K) ~1 i( V1 [/ b* w while(1)
& `7 M9 c/ u6 Q- ^- r* ~! O+ O2 j: r {+ s+ P; D7 @7 r8 C
read_MSG_buffer(pshreRAM);1 \; B- R4 Y# O; Q
}
' h7 [* o' V2 E( K9 O5 N8 Z5 k}
. U! Y0 o# N: g2 p! M( s, W2 ?0 n1 x9 j. i" k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
W$ d3 h0 S4 L" K{
- A% u2 m$ D1 O$ F% J! H+ ~ RX_MSG_PROTOCOL buf;
5 ~% `: h& I' P2 a1 h* C& s% { 5 E- H4 |* |( L: ]9 j
buf.a = pshreRAM->a;
# \5 A$ h$ P* Q* @2 M+ H1 I buf.b = pshreRAM->b;/ D/ J# @, P6 {- \
buf.packet_cout = pshreRAM->packet_cout;
/ r% N3 _9 l( Q% N. k2 M % b5 i; B+ \' k
if(buf.packet_cout != count_copy)2 i+ z. G5 `4 Y" d- F, P, G
{
6 N. [3 F) W8 X+ K$ O- d printf("a is %d\n", buf.a);
1 K! z( ^$ F6 y printf("b is %d\n", buf.b);
7 u! X8 b' i7 |; N6 M6 Z printf("count is %d\n", buf.packet_cout);' B) ?: G8 y4 q6 i! j6 [# ~
count_copy = buf.packet_cout; T. J8 ^2 M# I- I' @4 P
}: c! d& G& k+ |( m3 W5 g( I7 T& j1 h
else" ]8 M0 s l3 ]* W* ^
{9 y0 J) O: f/ U4 h0 }' D1 T
printf("No effective message!");
+ B. y5 Z" @8 i9 X2 t: @ }
& V% B" q4 B5 F/ {7 W3 h2 P5 }}
/ ^+ I% r, ^% F& L( B2 s7 g5 j# L
( N- [& v! R( h! C8 q) ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: ~/ s% |: i- t( W使用下面代码,对内存使用了mmap函数后:
' ~$ ], V# N g7 e* z* _#include <stdio.h>
, H" J# i- `, [8 c- s#include <unistd.h>$ e, c: I: `7 O. \! d
#include <sys/mman.h>
, P6 P% O1 `0 a5 G$ i) @#include <sys/types.h># R! e$ Z; A" H0 B1 l& a
#include <fcntl.h>
& g \/ r9 ?$ Z' U7 b8 n
& Z6 ~1 R; x0 e! p#define SHAER_RAM_BASE_ADDR (0x80000000)
/ U6 S# d7 P' K n1 k#define SHAER_RAM_SIZE (0x20000)
s) f& q- y/ F7 L- `4 z# @% P
8 G, M5 [+ e- C) R' |6 E; q! Q7 qtypedef struct8 D+ g5 o4 P; j! a) O1 k( Q: i
{: j+ t" w Z3 A# A9 K1 z3 S" g
unsigned int a;! w- j/ w B$ E4 k% \* n# m0 y/ j
unsigned int b;
) j5 e3 o# o. p# B2 F2 c+ \* q6 k! |$ t unsigned int packet_cout;2 D. y! ~8 W$ |, @( z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ H( T& L1 }6 I0 e
! t+ ~+ K A/ A; `0 j7 e* V6 Y$ L) _9 i
void read_MSG_buffer(int *baseaddr);9 Q _1 p) T: D+ B
unsigned int count_copy = 0;9 _; l& f! j7 _4 h2 {# H
* I9 W/ N$ b: Yint main()2 c3 G3 Q9 v) r& |5 u7 I
{
: }, N: m( q+ N int fd;
, z* ]2 l C4 d0 _6 z& H int *mem = NULL;: C* @. i# m# G$ e3 u, Q
5 ~' k4 e# b* p0 ~, V; _) [' B) _& B
if((fd = open("/dev/mem", O_RDWR)) <0)
& P' `0 M9 R. b- N {
% h9 u5 |$ Q7 [9 N; |' @6 P perror("open error");
' O) j9 N# f# o, }% Q( h$ f, h# \ return -1;8 K5 s" M. l3 Y9 Q/ J: W% X
}
Q0 ?0 B+ ~( }6 A! m+ `3 K0 H9 V9 B
_6 E( p/ w2 M, I mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 A: ?& g: E# b h- [/ K/ I
" G* b+ f' Y1 B) e5 I while(1)
( x+ J0 m2 @* e x7 I# p {
* \8 i7 S! A* e2 ]& t* [1 g. P' z# K% s' b read_MSG_buffer(mem);. ~, c6 p; X5 V" e& a# _
}
/ ~# W5 Q4 b1 w; D4 u5 q5 j E}, x5 i: N l9 Y0 F) R- X F
0 I5 |9 e/ \! k1 c$ |8 M O
void read_MSG_buffer(int *baseaddr)$ [2 h$ }/ L: n) a7 T) M/ k7 y
{3 T% y: x6 B# H
pRX_MSG_PROTOCOL pshreRAM = NULL;
! R) j. @, `5 J! m2 K u' w: r& e0 H6 k1 s' g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 R$ l) G! i) A2 c9 I& S. r- n
; R( M7 W- ] H8 L$ U( [2 S if(pshreRAM->packet_cout != count_copy)* N2 `, F' S; g% Q6 L) B
{
: c$ W; S- O* |$ s# P2 D; I3 D+ f! N printf("a is %d\n", pshreRAM->a);
# d5 m* h+ d+ v/ K4 l& ^/ @ printf("b is %d\n", pshreRAM->b);
1 b; C+ j% B0 _4 E s1 t$ U printf("count is %d\n", pshreRAM->packet_cout);
3 D3 @) D: v9 @ count_copy = pshreRAM->packet_cout;
- M# ]% [, A. z/ {% A3 J, S( n9 ` }3 a* D# x; j* b" l
else( @# P) A, h4 m( E- r
{
! g) _% ~$ W. ]" ^ printf("No effective message!\n");# m0 N" u/ m* \0 T, v
}3 l' s8 b# ^3 x. P
}$ m2 w& k9 Y9 A" \
4 } ]& O! O8 w& Y, d' n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& b5 \4 S+ }6 [4 l
( a; H( u( E. T! e- a" j7 ~- t) ]4 S( j
0 Z. e5 y$ X2 ?$ H2 W- @5 _
( N- _) n# g6 ~8 y
|
|