|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, \. e# j" _) H# M3 j
; K9 [7 o1 p, ^ ]: D! T# n, qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! Y% Z8 G! ?! Z8 X$ E) [( h
#include <unistd.h>) B5 k R3 W+ \, D( @8 N% |
#include <sys/mman.h>
1 ~3 A% v, v7 z" p% ^* V9 S#include <sys/types.h>
& h( e" M/ Y) e ^: Y#include <fcntl.h>. `8 m1 h$ j$ T: c+ Y6 O
' r2 t: A: t5 _" q% V#define SHAER_RAM_BASE_ADDR (0x80000000) 2 y* n8 X7 u& o: p0 H# z
* T' N$ O8 [$ G6 O) j8 w8 f# M
typedef struct
6 B* D* f9 x8 G* Z4 i6 M9 |{
' C! e+ o" `$ Q5 m$ @ unsigned int a;5 F! Q! |0 `: l
unsigned int b;1 A2 t H' B9 [+ D+ X
unsigned int packet_cout;, O1 a% V" k# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' a3 H7 V! V9 T. G3 [3 q1 T
2 Z' S9 H- A+ Z' ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 W9 Q+ d2 g: r% \4 K2 _; _
unsigned int count_copy = 0;1 V& A' g( M! o1 I {
* ]! E: _# Y( W' h+ o
+ T. ^9 y0 f3 w, n6 Q( }
int main()
) S2 g2 b: m' R7 f{) v0 G& U6 V/ j
pRX_MSG_PROTOCOL pshreRAM = NULL;
* n( ^# G6 j6 Y" ~ o; w pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; e* a7 S% y: d; b6 l+ U
1 o! ]$ l1 r' \! g' K6 ? while(1)
/ j9 e' M+ I3 I {6 c, Z( Z. P( h& V
read_MSG_buffer(pshreRAM);
2 p' G! S6 H2 t4 }; ^6 @% @ } 0 U7 j- c1 l% W
}/ S9 X6 p& s* x. {
) d2 X4 g, v5 z* h2 ?; I( Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, F8 T' m) k4 ^7 }# u{ v- D# B; m# J9 k6 f- y8 B! i
RX_MSG_PROTOCOL buf;: b3 B0 l' V) H% }
1 K4 h% y2 ~+ g4 g4 u5 X buf.a = pshreRAM->a;; ]$ ^5 H7 F$ Z
buf.b = pshreRAM->b;. w8 u( |" g: D. [* i: C5 u
buf.packet_cout = pshreRAM->packet_cout;* |+ V, q5 P5 e+ Y2 h
9 T1 `+ p/ T- ]+ L/ j- N0 {
if(buf.packet_cout != count_copy)
/ W: i! ^' e b. @ {* t6 e% {, P8 }
printf("a is %d\n", buf.a);
- t8 @5 {8 \: s+ @ printf("b is %d\n", buf.b);
7 a! a( A8 l9 w3 U; z, F$ a7 Z+ ] printf("count is %d\n", buf.packet_cout);) Y8 L7 y( s* M5 E6 S6 u5 J( k
count_copy = buf.packet_cout;6 |/ L+ o1 M9 h" Q1 @4 r
}; o) V7 P4 V# n7 w' k
else7 B! w, {! i `& U( |
{
B! v9 g A. b8 _& K printf("No effective message!");7 M/ k' _: {. G
}
9 O `' s J; Y}2 I8 o6 G* D. H& ]3 J
! R+ G) U1 V: @0 |) v/ c9 t' t
4 ^5 s- e$ l( E( w* I- n2 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* r: r+ R) ^0 w- H0 [
使用下面代码,对内存使用了mmap函数后:8 ^, q: C1 e: \7 D( B7 F
#include <stdio.h>
9 j. j: a7 T2 d5 e' _0 ?#include <unistd.h>; o$ k# m3 }/ Y, F$ R1 @. {
#include <sys/mman.h>
. q8 p& L1 h) h) X#include <sys/types.h>7 C( y2 A2 Q8 z9 q7 p
#include <fcntl.h>
p ^+ r; i( W
# u# A6 N1 X! C1 k6 Z7 R#define SHAER_RAM_BASE_ADDR (0x80000000)2 v9 J$ T R9 W# I( d& k% U
#define SHAER_RAM_SIZE (0x20000)
; C1 f6 W- [3 N. r0 ?( X3 x* a, |6 C" x! k9 K, |3 B
typedef struct) J4 k( u9 {- g, g! x7 \
{
$ u* W7 w3 F- ~! }1 ^5 X unsigned int a;
* y! W7 y0 X. p unsigned int b;
, p1 D' Z+ E& }% d unsigned int packet_cout;
6 n% w# l! v* v8 j" f" G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 P' N8 Z& G, @) S9 G4 W9 o
0 B' O/ I6 J3 U7 w# ^6 d: Q3 cvoid read_MSG_buffer(int *baseaddr);
3 q, _# G8 M L+ zunsigned int count_copy = 0;
. t) Y8 i8 x5 ]! q
# s% K: R7 [+ B, B6 b9 H* Xint main()
% X+ o! _* @4 p2 j{
$ x: e2 Q2 y3 S int fd;6 A, d" G8 S9 Y/ D
int *mem = NULL;
/ v% t# p' c& |) C0 o! a7 [% w8 [5 }$ Y! A& k9 y
if((fd = open("/dev/mem", O_RDWR)) <0), g/ u9 {3 H- _) h; C! [ ^
{: m; V, a9 ^+ `7 N" a* {# C+ `
perror("open error");* q. ?" x5 `& F; W4 S5 f1 w. A# C5 U
return -1; r# |( {/ ~- `% f( p0 y$ p
}& c' Y+ e; ]0 @7 `8 K/ s% _2 s
, c. F9 t+ w- A1 o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- ~) D) o' }7 i" Y) c2 @
3 d& }2 l; ~# Z+ Y' R7 A$ u k' S while(1)
* A- o# q6 c. I6 L+ {) K6 D% f {
+ x! `- ]& y2 X5 Q: A read_MSG_buffer(mem);& l- B& s' Z! h
}
9 ], |! M# \& F. ^8 ^! ?}3 |' ^# i( ~! y' g% w' b4 _' H
3 N* U; ]4 F& w( |: ivoid read_MSG_buffer(int *baseaddr)
) ?) u0 K7 v O I{
( E% S& }9 I( }3 U! h( e pRX_MSG_PROTOCOL pshreRAM = NULL;8 ~/ Y# f ^2 y0 k: h* t% X. e
6 A, g; @; y$ a) H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ [8 S- ~% ?! `1 [3 f1 t
1 H! E# s3 U9 U* d2 g! n: s if(pshreRAM->packet_cout != count_copy)) p' M/ I. ]% u8 U
{
8 R T- q' u R* g. Q8 C _8 {4 } printf("a is %d\n", pshreRAM->a);9 M! O1 `; ?% F+ n, ?1 P
printf("b is %d\n", pshreRAM->b);
* H9 V5 z T W( E1 ^ d( B printf("count is %d\n", pshreRAM->packet_cout);
: c. G( G5 \, F! D" J* Y* ~8 Q count_copy = pshreRAM->packet_cout;
Q9 Z, z% y' K9 r }7 ~3 F% x( Y* H6 G: @. ?3 x3 y
else+ t7 ?. d$ T# Z
{: P4 T- a1 A; o5 p) @( t
printf("No effective message!\n");% e6 ~4 E/ f. p) G1 F
}- ]7 q$ d8 |4 C7 v
}+ t; m8 h( Y7 b$ k) ^
# e0 N) F/ d9 y, X, L1 K! O% {! v. B1 r: J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; u: t5 h8 ?6 Q
- Q( X# C& t+ @) b1 n/ L
2 d6 D& y3 n4 O" T! D4 [9 ?+ j5 r" U) e
# c' {5 @( q. B% G( m+ R- a
|
|