|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' L+ j: K1 d. F. B
; d4 ~# o) X5 O* k c/ n9 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 w; ? ` }& S#include <unistd.h>7 W/ H+ _" K% J5 j
#include <sys/mman.h>
9 ]% A# \( N; J+ l% T, D I#include <sys/types.h>% S$ ^) ~% Q8 ~. _
#include <fcntl.h>
$ K( y2 r3 G P/ b) ]
# U( U z- s5 p2 S) l {#define SHAER_RAM_BASE_ADDR (0x80000000)
, O0 ?$ w0 F/ ~9 I, e' Z7 A% e! m$ j8 s8 k. g2 }
typedef struct
: X6 g& M5 \: i' _{
/ k: C6 I, e* N2 u unsigned int a;
6 |& U. z$ A- E" d# s7 t8 V/ x unsigned int b;
. d3 q4 L |- N: o: l* E$ D; q unsigned int packet_cout;
, o+ k+ Y5 |9 ? y5 s4 B# o$ c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 Y( |, {! Q0 ?9 K9 \) Y! o1 A6 @) a/ A& z. O9 H3 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 D/ |( A( D' I! P
unsigned int count_copy = 0;6 ~8 O# \& k2 A/ r7 m
' N- X6 q/ f0 ]% B0 O" P# O
4 n0 |' T4 `5 H* lint main()& \' h/ Z/ q y. ]: y' L
{, f4 T' O) B( o$ d
pRX_MSG_PROTOCOL pshreRAM = NULL;8 v& q7 s6 w* V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 {9 \' @; D1 @ n! J4 i5 y8 Y1 k1 q( M4 \# @4 q
while(1)
3 L* F' ^# [, t$ c {" y' ~) |" e2 k
read_MSG_buffer(pshreRAM);
; `! m! c' P0 w, K( [ }
* f( N$ E. H$ y' O) p1 M, t}
+ u& I+ M+ j9 q3 |3 Z2 ?" C E) x! \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 y' A# J) k- q5 K! p{3 H7 x- A: N' ^" Y
RX_MSG_PROTOCOL buf;
* C8 Q; j x$ r1 L9 r+ n# [6 Y 6 v' p- _2 C2 g/ z. C
buf.a = pshreRAM->a;
: q- \- [# I3 w/ b buf.b = pshreRAM->b;
5 f# T0 {2 j2 \) S buf.packet_cout = pshreRAM->packet_cout;+ l+ R: f3 t: ^' `
$ R5 w# r1 r( G! \ if(buf.packet_cout != count_copy)9 Q- h0 L0 o# h6 }1 T- ~
{4 E) @* B& p0 u' }2 J$ u
printf("a is %d\n", buf.a);
; p6 u! ]3 @- G6 w printf("b is %d\n", buf.b);/ X* D* Q5 k" u) B1 S- R
printf("count is %d\n", buf.packet_cout);4 a. J. P: I9 B6 c4 @8 X% B% \
count_copy = buf.packet_cout;
$ s" _3 X) Z* I1 e I9 [$ s6 } }
6 ~, z4 I! D* A else: p4 D& I* i; T$ y
{( e" T8 q; R: G3 v+ b: t3 l" a
printf("No effective message!");
/ P2 @5 K% W$ m$ P }# x# s9 D9 L6 ?) a n
}
' y0 A1 K4 v n) W F( k2 y4 F: K: r' A8 C" R
$ z0 N% g9 g3 y' V- m; M- R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; Z# M4 _- I8 d" |+ O
使用下面代码,对内存使用了mmap函数后:
, E( h% k( M2 W, W- @% b4 ^#include <stdio.h># l) R& Q8 v. s* a9 H
#include <unistd.h>
$ d) ` M6 v* E$ p- u#include <sys/mman.h>+ E0 _ k8 i7 y( X
#include <sys/types.h>" f2 R( W+ P) Q4 P R' v
#include <fcntl.h>
* h4 O! p3 w ~) z/ {% w% y0 E' C5 X' `
#define SHAER_RAM_BASE_ADDR (0x80000000)2 F) t# d3 [# P2 j
#define SHAER_RAM_SIZE (0x20000)
) A+ b; y7 j q( z; @# i5 b' l! R+ ?- i
m$ {$ J1 B, a6 P1 n3 vtypedef struct
. D8 T. t- J7 L+ p( b u{, j0 `' K5 `+ E8 X9 a* t
unsigned int a;' s) T7 `; @4 W+ C, ^# }
unsigned int b;
. V" }, D/ v6 K Y+ B; S unsigned int packet_cout;
2 E# W9 Q( V5 o" g) V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- N! X' u3 n9 m, G0 X1 l: | a9 ~
S6 n% B6 S! A% Mvoid read_MSG_buffer(int *baseaddr);
: ~9 W0 x0 q8 s/ v& a3 @: S- Funsigned int count_copy = 0;
$ ?7 a% f, @0 y! K: Z$ x3 I+ u5 X0 m+ m0 t
int main(), W' Z9 `; y6 J; F/ n
{: T) n, C) C. e/ Z7 S
int fd;
' u" A6 _ p7 V4 o: [: z h int *mem = NULL;) `& ?3 X9 S/ n" @9 l
( R6 O6 Y. U8 I0 r2 H# ^' _ if((fd = open("/dev/mem", O_RDWR)) <0)
/ s1 K7 J9 J* q" E2 c {
9 a+ ]) [1 Q; V/ y- d3 g1 P# S perror("open error");
/ X" k2 U, f( V4 B9 Q return -1;0 Z6 i9 L4 K/ c Q: F! W! e
}
8 c& j* q2 J+ W4 |/ y
% p8 x$ }6 B: ]) M$ w) B3 ~9 S8 ?' A) _ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' }) n: L4 v2 T# v8 j
x( z# { @; k6 x, n while(1)
- t$ R& L3 b5 e! q {
- l4 s! e$ q5 G/ k7 Z7 [* k Q read_MSG_buffer(mem);
/ f8 Z, T% O" U } # X' n5 m7 L$ a
}
& b4 o7 D4 S" L
$ Q: N, l M A R- ^- }; \void read_MSG_buffer(int *baseaddr)
! V; G6 O+ j/ I; Q& s G2 M{
% Q4 W$ X" r, @ pRX_MSG_PROTOCOL pshreRAM = NULL;8 ?$ _) ]& V1 L7 I2 j" N( z2 b
7 |$ E x+ Y2 x) ] pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ M% d9 w* l; g: i7 b3 l6 r) j J
# U9 G w1 k% b* t if(pshreRAM->packet_cout != count_copy)3 f8 L$ ]* C4 n5 X P9 E
{. T! D+ |- l5 m8 P# L1 R0 U% Y, f
printf("a is %d\n", pshreRAM->a);) F# K. O7 u7 |* u' ~4 {$ x2 e
printf("b is %d\n", pshreRAM->b);3 c" _8 f5 R9 k
printf("count is %d\n", pshreRAM->packet_cout);
' Y5 a# H& r* J4 L1 w9 j ]% n count_copy = pshreRAM->packet_cout;5 h( U, `2 R4 q; | V8 e
}. b1 _3 a# I4 _3 I1 m' C* P- p
else
4 _ R: [5 `' ?+ q {
$ z3 g0 v# i: ]3 i) ` printf("No effective message!\n");
, g0 ^1 v0 u! V& v6 G% @+ R7 j }4 y3 L0 i8 }* }7 c* T/ G
}
# ^4 s, X' ^/ {/ v/ g8 b: u. V% N/ e7 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 |/ ~' T7 r- @& D. T y
0 t$ v8 A6 j5 P' r( u3 o. q. |3 \3 V( {
) _. b8 ~0 x2 }& M2 U
8 R/ k8 K" x! e3 P1 v |
|