|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 ?( J# P7 O1 e: X; y
+ ^0 [( r5 }+ v3 S" { Z XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 p8 o" E( e& x3 s3 i& H3 z7 d- l4 F
#include <unistd.h>& K" s* p; D% O4 V5 I4 p, i% j
#include <sys/mman.h>
9 z7 ^8 |- K- [7 V: b/ y6 @8 T#include <sys/types.h>7 [" A5 X" K" j6 r
#include <fcntl.h>/ F3 E3 B# n3 u9 z
) d) G2 A1 i# ]% _. T6 R0 u; z
#define SHAER_RAM_BASE_ADDR (0x80000000) / r" m9 K+ K9 o( a$ ]4 L9 q
/ y8 u* h A, b1 Y1 V# i5 c+ @* Rtypedef struct
5 _7 x$ p! @( f4 t5 \) W, q{
/ O) _8 G. w9 E unsigned int a;- j, F! ~+ E2 m+ V$ ~3 v# ~% r
unsigned int b;
* X: s) R& c! i+ f8 M unsigned int packet_cout;
7 v0 Y" r* W0 B7 L. k. K# T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# O% X& C- H! p$ t. G% o: y5 J' w( P+ n( i7 o' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 j" I' B0 }+ G' x
unsigned int count_copy = 0;: w1 x/ L# `# _& T2 F5 X# @. ^
+ k$ ~. ^4 Y: |. {
- V1 @: C* e& j. e& e
int main()$ c4 C. I8 L3 m, `8 u
{
7 H% l2 |0 T7 m% d) T& u pRX_MSG_PROTOCOL pshreRAM = NULL;- j% d' f, i. ^4 D2 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% C2 M3 P7 ?* O( v) i+ c8 O
) c! z8 Z7 T6 S
while(1)7 ^& T' n1 A" n7 C. `
{( L# G% M+ o9 m% B! |
read_MSG_buffer(pshreRAM);
1 }, O) J0 j& o" n- |0 N$ z }
; ]2 ?+ M9 s2 c: e- J}
5 O6 \# _2 M/ T* T5 x1 W. H
4 |5 Q% }4 X; y3 ~- lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- C3 Y$ U5 r' q( t
{
5 m+ v0 Q- T# Z, ?3 t* T5 t; D RX_MSG_PROTOCOL buf;- O- i' D% K1 D; ^: Z' [
! Z9 d7 u- D" O
buf.a = pshreRAM->a;- d8 o5 R7 C! X: Y& ?* e; e
buf.b = pshreRAM->b;
1 y. _5 K' j+ ^ @! N0 R buf.packet_cout = pshreRAM->packet_cout;, s( L+ @* I3 v* A
( b* X$ N' K4 n5 X9 K2 h
if(buf.packet_cout != count_copy)$ o& S' P3 E5 L
{3 T: M9 Q% A2 B$ T
printf("a is %d\n", buf.a);
+ n' W, H! f9 y. V; p printf("b is %d\n", buf.b);8 I- c7 U2 i$ l) q
printf("count is %d\n", buf.packet_cout);
\0 L# y1 O Y, z4 [& }7 \ count_copy = buf.packet_cout;
* Q* c" [& K) c0 A( j/ A }+ N- W! T4 [! |( L/ V
else6 ]1 L1 }+ u ]4 c
{
! Y( g7 B V0 ^5 G printf("No effective message!");
( K+ R( e ~/ W7 A }& M3 L& D) k) k8 U: s; k: Z1 }$ l& x
}
: l0 e; l/ L* k I0 q$ r6 ~
& { v, Z% S' v2 p) z! q& |. k
% D- ]% q* ]# ^" ~- u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- b+ t9 ~( s( g3 h4 P7 _使用下面代码,对内存使用了mmap函数后: J9 B) C5 X' }: P9 M
#include <stdio.h>
; B1 ]% u+ _# [& Q: i l0 ]1 V#include <unistd.h>
3 u3 j* o3 \5 B# Y) [$ S0 {#include <sys/mman.h>. S$ Z0 e* B" f" A( }0 m. y
#include <sys/types.h>
$ q, C0 `3 n8 c#include <fcntl.h>$ w. Y7 t( ~* C( L& P$ s
5 V, G! ^4 x. U7 R. ?" @
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ~- i8 W3 [" Q8 Y#define SHAER_RAM_SIZE (0x20000) 8 D) j' L) B/ n( ~- X5 d# |
' D1 v u# ^) B+ |+ q& o& v! Vtypedef struct& G; j% d1 V# f6 K9 Z) j
{
$ {: H$ z; C% b unsigned int a;
$ Q; w( R( b6 r0 P3 U) g0 i unsigned int b;
( [% C7 S$ k. [5 n& t unsigned int packet_cout;$ e1 ?1 N& e0 \1 ]4 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% C% u9 h# C% t4 ?1 \# z5 A
& w) l4 S& e' l( N9 d5 P( svoid read_MSG_buffer(int *baseaddr);
9 S% S3 k8 U6 u" qunsigned int count_copy = 0;0 m0 J A, H* A y# Q0 _
4 ~2 f: s- A2 Wint main()0 g% r7 ?+ b$ C7 s6 l# |- S
{
; Q. h- m9 K9 N2 ]) r5 k, V int fd;
# k7 ]% g- }, v& C! w7 j int *mem = NULL;* N! p- |0 y1 M2 R
5 |. X) ?: I, r if((fd = open("/dev/mem", O_RDWR)) <0)
- }" t% d% V# a# n( b {
& ]8 _ T6 u% N2 a perror("open error");
1 C- i6 _3 H$ c5 u return -1;
2 _ `! F# I# ]: \# Q2 o }$ l& Q C$ ^! w, ~8 Q/ S
+ L8 i+ ?4 F$ N8 _: }$ a8 e# Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ J+ t7 Y P7 L* B j+ B8 J- z
4 V) w. I$ n& b; u' z( _
while(1)/ T' k* P/ L9 e8 _# j
{5 j. ?" f7 g _6 d7 f0 q
read_MSG_buffer(mem);
9 m5 S% d$ U! }2 X# U" O/ @5 @: Y } 4 l- Q+ z# e& h
}
1 ]- ^$ v5 g% O) `( O. _5 {
9 i. n. \8 i# f8 D+ X' A1 }3 cvoid read_MSG_buffer(int *baseaddr)2 f0 v6 `# G4 W( }. g4 C
{
. q$ V. N6 t! m4 D: @ pRX_MSG_PROTOCOL pshreRAM = NULL;: J6 G- m b1 }# A6 ?* V" e
% ]$ k: e0 S& A' H( a: r D* `- S; @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! P4 v$ Q, h/ g7 a2 m
# k' ]& \4 t; d" ~% j
if(pshreRAM->packet_cout != count_copy)
- ?- N+ j- `' c2 e7 `+ n7 @4 R {
0 v2 f# z6 S9 u" P7 y& P printf("a is %d\n", pshreRAM->a);
@2 n1 v) o2 J/ N a printf("b is %d\n", pshreRAM->b);
6 o5 b( H5 b$ ~3 ~( l% U printf("count is %d\n", pshreRAM->packet_cout);
+ [$ i% s+ D) E3 Z |' { count_copy = pshreRAM->packet_cout;
9 e- [/ }" G- ]; n: i }" E+ D; O( i& C
else
7 M, V* [4 E8 F4 r {
) n5 i2 u. f' w: ~ printf("No effective message!\n");' g. }) T: S+ ^& a8 [4 M
}
1 L0 i* F3 i2 u% S}
" ? f% _% d* V7 n9 Q, F2 e
% q3 l! \! D+ h) L/ B" `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 S2 Q( `: }. ` ?; g
5 K3 s" _3 K5 A% _* R
0 v' c: G9 h9 } t6 z) k# ~
& B9 U' e [8 t% R
5 P6 c, @$ F) w/ ? |
|