|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 @5 M! l/ m0 B) k9 |' E# i+ t
- n6 m9 o! p/ M3 L: W! [! Z" k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ T3 P& B$ Y# M; Z) T% ^
#include <unistd.h> T1 E2 b7 Z2 i
#include <sys/mman.h>; ]& o& K9 x$ y3 M- X' q
#include <sys/types.h>- ]% T1 U& V/ T( O K3 ?
#include <fcntl.h>% D( P( H9 V1 O+ V# [! @" p5 f0 N7 x
' x1 c7 {( c* V#define SHAER_RAM_BASE_ADDR (0x80000000) 8 q/ o8 b9 N: C# q7 \
3 @2 `7 D; y7 E% D6 \; U- Y
typedef struct/ t/ x+ N' s4 f
{
I$ c' \% x8 j+ o# P6 M unsigned int a;
/ V3 @% K [! ^* r9 k" n8 V8 A unsigned int b;
5 _4 w9 _* j/ e$ @$ u unsigned int packet_cout;. X) @* q' Q: O8 z3 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" c+ n8 ^3 g" |9 [ l
g$ R; e# ~, E* f& ?9 C( lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 a. [" T/ M1 z# l2 S% k
unsigned int count_copy = 0;; l ~8 k# ~( o
) `& ~4 x9 r7 z1 C N/ g5 f) x! ]9 U
int main()& t2 K. _6 A, ^( `7 r* C
{
- E; u- z+ ]+ x0 D; o# d6 T p6 I pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V, y$ E* O7 w: v M! ?8 S: F pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# \( A* u5 D; c) d
9 K V: ]9 C ~( a/ e$ ]% z5 [1 ~
while(1)! V. }4 k% n4 a' m7 R; O
{* l4 c+ C* t( T; q% x4 H
read_MSG_buffer(pshreRAM);8 }, d& x3 c/ S& }0 v8 O
}
9 T" H1 J4 P0 g9 X$ @}6 O* F/ I: W+ ~1 J# T6 ]
2 Z$ B+ k* ]1 ]0 L5 @* Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 J0 @6 I1 L( J/ r0 d# q/ Y
{) q& t6 y7 _: K' s' z' a l ~
RX_MSG_PROTOCOL buf;
0 ~1 B8 [ E4 h1 {: x: @5 ?
@+ l" `6 l4 x6 o& }) q/ X buf.a = pshreRAM->a;
7 ?- N A+ L) v0 O buf.b = pshreRAM->b;9 J; s0 P$ }. N
buf.packet_cout = pshreRAM->packet_cout;
7 C* \. r: V' m: g. s; C3 Z
; E( K9 _/ b1 {) W+ V1 N& S if(buf.packet_cout != count_copy), M4 F4 V! A" U7 Q' i" k
{: ^- v! f2 ? A8 l+ J0 @; x$ M
printf("a is %d\n", buf.a);
9 j3 p3 M% H5 L printf("b is %d\n", buf.b);# j- |' P7 _# S3 g# L. @9 B
printf("count is %d\n", buf.packet_cout);& g/ b, ?. ^: s* G8 r* C# A* k1 n
count_copy = buf.packet_cout;
) W" i" U' j" S* q; ^; ]% i }
. j1 }- R1 O1 g/ W( N' }7 S else4 W1 t- @# n2 g1 r! z* M' J
{( \9 d# t% ]; [' m
printf("No effective message!");* }; l t2 d6 Z6 @. Y+ h0 r" ]
}( H# W2 a' u/ Y" S& ~
}# s" D% x7 v. z" e! s% Z
) `% I8 M" J4 E1 O
! C( h9 _) E3 |3 |5 Y* a$ B) U, }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& O9 W/ K' G( ]0 }6 b& C' S
使用下面代码,对内存使用了mmap函数后:
% ? z$ U6 _9 _$ R/ o5 u8 Q" N#include <stdio.h>% J0 P: |8 ~& ^$ H) U/ q5 }, T
#include <unistd.h># `/ V j% w' F$ z/ \
#include <sys/mman.h>( T( F9 F- s! e+ ~% n
#include <sys/types.h>' G, j. v; U5 V1 Y& v1 N/ v" F
#include <fcntl.h>
: W# N: x" \! y4 q. Y! F" u9 j! y/ Z' k' {4 N+ w% h
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 Y: i$ z$ _7 b+ K#define SHAER_RAM_SIZE (0x20000)
( x; ^# F/ N0 ?6 V( v& b9 V5 i4 c
3 t8 ?' R% `! H& D* Z! E% jtypedef struct; n) G" D2 S& B2 F+ |! u3 X) g
{# ~0 U; \" C$ h: ^9 N' W3 L% t
unsigned int a;6 Z6 v% L$ M6 z \& X, ^
unsigned int b;
9 H5 R. W% M! z, c unsigned int packet_cout;
N& b* n6 b- @) X* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) l3 v7 d5 }) y1 l! t
5 D# X7 g r1 g5 k& D2 {- V* Gvoid read_MSG_buffer(int *baseaddr);3 R# J, w0 V3 a; z* ?
unsigned int count_copy = 0;2 s% U5 R/ @% G9 h
A* ?) Q' l1 Qint main()! R2 K& S0 I2 v3 O: E+ z
{
0 l- z" X7 z0 h/ m) l1 k int fd;7 Y1 w5 c( a, W1 K. P
int *mem = NULL;/ Z" A* q6 e, X
8 A7 X1 _$ e. ?( I' S if((fd = open("/dev/mem", O_RDWR)) <0)5 w6 q, A$ Q* U' A [
{
+ V9 V1 l/ }, P" _! O perror("open error");
2 S2 u6 A" k8 H+ i return -1;6 O: U. f" n' V: T/ f" H1 s
}1 e* S3 _0 z5 Q6 Z) c
8 T9 v1 E8 F0 |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( m. N" }3 {; Z9 Y4 F2 Y( A5 s* |
) w/ x- \) e( Z' \ while(1): z. d& E; N6 a, G' N# a* ?
{) I) M/ ?0 v$ M7 F1 y
read_MSG_buffer(mem);( f; U, `' o- X5 d
}
8 V) {$ E7 V9 W8 {5 o}# m( L% I7 \+ X% V
- k. q& _# S) _# v' q8 N7 a
void read_MSG_buffer(int *baseaddr)
* ?0 r; X$ G( x$ I0 ?" r! e' \{
$ x* p( l) _$ c& f" ^ pRX_MSG_PROTOCOL pshreRAM = NULL;5 y: R0 }+ `7 }0 h5 E& t
3 H3 U9 C9 \, ~' a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ s9 e m0 Z; h4 ~5 L: l2 X! O9 M- l% g6 j7 Y$ p( @- e
if(pshreRAM->packet_cout != count_copy)
3 w. M; h/ _9 a7 s) w {
# m5 O* H0 k0 M" \5 v printf("a is %d\n", pshreRAM->a);2 h; y0 o* o6 k7 |& a
printf("b is %d\n", pshreRAM->b);
8 w0 a8 u( Y0 m! _# l* Z printf("count is %d\n", pshreRAM->packet_cout);
; y0 n8 {! f: F3 [/ k, a3 ] count_copy = pshreRAM->packet_cout;, C( b' N; @3 A- ]+ R
}
6 N0 H* ]6 t1 [# I# N( T. }3 o/ s: q/ o b else
4 ^# f5 U t; w. |2 V {
/ y" G: M! c$ [5 g! _& t" W( G printf("No effective message!\n");4 u) V7 G7 b5 `0 S
}
I f0 I" j8 n$ e. n; y5 {. k0 L}3 S; E+ u" V2 g4 p) i3 C. W! V
! _' d2 i& i: [3 U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( o8 p' c( ~& { n- p) ~% A* j
. m- @7 m# @' x8 M- i8 K4 C W" L( N0 O* B1 C, I8 L! U0 V7 _ U
1 d* B: D8 Y0 P, m
|8 K% k$ ?7 J |
|