|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" s4 u. C( T0 R1 S8 f
( \# `2 h$ l2 l1 J3 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 @( H) S* z7 o' P! e. F
#include <unistd.h>/ T( o7 R8 z4 l' p4 d6 j& @
#include <sys/mman.h>
& _% M4 G6 \) @! ~' \( x$ q7 l4 ^#include <sys/types.h>
, U: [0 w$ r4 [" K! E8 Y2 @#include <fcntl.h>1 e- o" b7 E0 V& z1 i$ v
) x2 c( Q- Z' i3 K! u0 x G
#define SHAER_RAM_BASE_ADDR (0x80000000) I3 k. U. p' H P& A- _
7 ~2 L/ [* G6 w) ?2 X; Z7 h7 T& v/ B
typedef struct# j/ @5 @$ n* ^
{7 | ]& q* F r' }, ?! X3 b
unsigned int a;
' A% ^; m. I- R unsigned int b;
; z3 y* r9 W9 }" ]4 M. t' ?7 w; `0 { unsigned int packet_cout;
9 Y) \1 A9 U5 l. a7 H9 k. T% T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: L" R! i5 n% b( ^3 b* y0 n4 g) V
9 z8 |4 x6 I Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 l9 j! T0 W9 h! `9 A7 Y* @' ]unsigned int count_copy = 0;. K# v% @! [5 A; i3 L ^
! f+ i5 o/ Z% t: n8 Z6 _' z
0 }2 i, G; Q1 l l1 N. |3 o+ X
int main()9 h" E: m4 D3 O, }8 K
{
$ U/ r; B1 c" b9 }* l pRX_MSG_PROTOCOL pshreRAM = NULL;2 m, J( Z* A% e- g$ L) g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# \8 F2 r6 ?* u, @$ W- F1 J
2 W9 w, Q$ L& u7 l8 W" c while(1), ]0 K2 v S/ ^+ Q) n' p! ^5 D
{( y0 @% v' `: m) q5 O) n
read_MSG_buffer(pshreRAM);
1 {0 w/ X( O/ i, Z* G; @6 O- W }
* T' t5 q; P% C! U+ Y' k}
0 l% Y% _% N2 A# i a0 g0 W$ Y4 ~5 ?3 Z1 K# B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 c# I( O* E/ }1 p, N" D9 g{
* d/ |/ k2 |2 l0 p: D RX_MSG_PROTOCOL buf;) ~% u$ q* F$ e$ l
/ I6 k3 y4 j( H6 x0 y
buf.a = pshreRAM->a;
* r+ k- m- S9 ~ O buf.b = pshreRAM->b;/ l" ]( n. [3 d; s; F* {7 {5 _
buf.packet_cout = pshreRAM->packet_cout;2 N" A2 i3 X- Q) S
7 V! w0 U$ c9 b9 c) F
if(buf.packet_cout != count_copy) U; A3 F: l* t8 e/ n5 e! p
{
$ Z5 } t1 l4 {6 b printf("a is %d\n", buf.a);( f7 [! r, b& |. [
printf("b is %d\n", buf.b);9 p- ]2 S0 ^" A( I# S+ L
printf("count is %d\n", buf.packet_cout);% }8 z" u( w$ r+ y
count_copy = buf.packet_cout;
- _( F9 }; P' _) m3 `/ c d }, q& g2 {0 F4 e% i8 O! e( f
else" h: Z$ t$ l: ?0 D, `: d) U/ q
{
2 `- z! d3 _! v1 n printf("No effective message!");& W( j8 E# M& I" ?
}
2 z' H8 a: J" Q j$ X}
" d& [" x( d- O2 W2 h" a
9 R& A) g6 f U: e& T9 F8 Y" B
1 U$ E' R9 \5 x1 j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. X: w1 {% ^/ O5 o6 M
使用下面代码,对内存使用了mmap函数后:
2 H9 S. G" X2 E w#include <stdio.h>; C7 w2 X6 V, j% o9 j3 G, J
#include <unistd.h>
8 H5 K+ ~7 w8 \" l+ v#include <sys/mman.h>8 ^ L2 D1 ]& }# \: I) S7 h
#include <sys/types.h>3 p$ @* f- [, G$ m
#include <fcntl.h>
' D5 M6 F7 [$ C: o! e! |( S6 r
) S% J* F" `, w R#define SHAER_RAM_BASE_ADDR (0x80000000)2 S% g# k+ C. [! U8 r; ]
#define SHAER_RAM_SIZE (0x20000) + M, _6 x0 l! M( A. n7 W# c) ^
% i2 M$ Y+ j7 W; a7 |) k
typedef struct* c) N' |! h2 @ z' R
{4 a8 p7 U5 o1 N1 @4 s% A; o
unsigned int a;
9 [% K+ R1 y( m* `4 C unsigned int b;
6 c/ c- @2 j/ O9 h1 Y unsigned int packet_cout;8 j8 B% P* j& w+ ?$ t: Q! v0 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ Y) w O8 ?: R8 j
, V, N4 f6 p6 ?
void read_MSG_buffer(int *baseaddr);2 X" [4 U) V) P1 w2 R, \5 E
unsigned int count_copy = 0;
1 f% q4 e1 W9 Y' v$ m
: L7 @5 o2 f2 @1 Xint main()
9 c' c+ ]( M/ d+ Q{) l; |* S( \! {
int fd;+ ?3 P [0 J) h2 P8 H
int *mem = NULL;
' L" f4 H$ K' O0 n3 W, t0 ~
, H( }( ?2 d0 o, a. n if((fd = open("/dev/mem", O_RDWR)) <0)
8 R- W, t- ?7 o# N5 l7 M* M# Z {# t9 z7 I! Z8 S# m# s2 L6 m1 S+ E e- i
perror("open error");
. W; p. q9 V$ W* |: N4 g m return -1;" Q3 H8 v( e4 I
}9 F+ @7 i. c+ ]! j e: k, ~
6 i6 }1 v3 R k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- R2 c+ z, i4 v% U& p
: H% Q6 V% H/ F7 @4 Q. U# a
while(1)
/ {9 Z+ M* _$ Q {4 l- U6 @" R) f6 F, R# J
read_MSG_buffer(mem); C8 ~; L7 Q; e
} ' o( R: s, o4 y. D3 V! X' ]
}; }. ~% f3 I* r( [! ^
* k+ R) ~8 k' Dvoid read_MSG_buffer(int *baseaddr)
9 @; v# P) V% Y$ I7 {{$ e5 m. k, z- `& n' V1 D$ v! w
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ I0 k* q6 z% R$ T+ X7 g# J0 ?% u+ o! ~; V: D) N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# T5 o) w! E, y. Q% I
5 q8 w* E* ~6 S
if(pshreRAM->packet_cout != count_copy)
6 S0 D( R: s4 H/ C {
6 d* W' K; t3 W& f% i printf("a is %d\n", pshreRAM->a);
4 l) f/ W# ~* ?! |$ ], z1 w& S printf("b is %d\n", pshreRAM->b);7 V( W7 I: R5 Q
printf("count is %d\n", pshreRAM->packet_cout);: G- S) M, ]$ `$ w" O
count_copy = pshreRAM->packet_cout;
3 n5 X4 _# F8 i4 E* S- C' e }
' `% y, S7 [# ~4 L0 b+ p else
! M# G# N- S# Y& n1 w% Q- A' } {
0 Q/ _5 D! L1 t& d printf("No effective message!\n");
\$ r) q$ m8 p* D. I, g }
; A9 G8 r' k2 d& N v3 i$ z}
4 I, I& z* X" B+ E9 d1 |. n, S1 u5 Q5 ~' s" b7 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 L3 z9 R) x: z$ ]7 P1 z; L+ E0 R, y! {8 f1 k
5 a# K: c& R( D! R$ D
D: O1 \# _1 B( {0 g$ Q
7 P: g2 T/ I e% y' t4 W |
|