|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( A2 i- Q b3 x1 z! p
; Y0 P% }8 C, YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># _. x$ X6 D' y5 l' Q4 |
#include <unistd.h>
# {' i$ ~9 w+ L5 [4 w#include <sys/mman.h>
( S' }( A/ S+ E4 G2 @ C5 {* F#include <sys/types.h>9 i3 a s1 h6 r1 n
#include <fcntl.h>
; z/ W: s; S( o) |4 l3 H1 l: R2 W6 w* v/ p9 B" w# E" g( w- l
#define SHAER_RAM_BASE_ADDR (0x80000000) 0 J9 N( F, Z7 u
/ N& d; X7 V. O, r
typedef struct8 F+ T* n1 n1 G9 d6 r) F: U6 W& E
{
) q- l( d5 J2 C- r$ f) O! x" e. N unsigned int a;8 n/ E3 l7 h7 d" z& L
unsigned int b;4 q$ [, Z6 t$ e# \) P
unsigned int packet_cout;
+ \( ^+ j9 ~% i8 a, S b2 j. G& E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ s% n; j) B& ^" c; ~/ q
1 f8 k0 @& ~- H3 t+ Y! \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' \7 f, A; R/ v2 v; x$ K8 ~) Junsigned int count_copy = 0;
( e9 V5 E1 S, f4 L' o" \: Z
+ l" C* B- u3 A c1 S
1 E* k1 T5 e/ P- kint main()
9 D+ b( F* ^) \) Y{
4 ?4 L* q0 ~& h7 M pRX_MSG_PROTOCOL pshreRAM = NULL;) Q# O' d7 J3 |# k P$ n& O ?! {, ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* Z1 ]3 L V3 C- ?7 s) M
9 i) p0 Z6 v9 R h4 W/ ^ while(1)
: X1 |, J2 E4 d' H, \; o8 w) Y4 p! x {1 h4 D, c: h6 v: u1 y
read_MSG_buffer(pshreRAM);, n7 @* [1 ^' y6 x- T ^
} 1 \" l, k$ O5 E
}
1 o8 \3 K+ u: k/ A, n" G, y2 z8 m; e( L6 s, H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ Y4 S% [2 T, Q' v{
' I6 D3 M7 e& r8 o" i RX_MSG_PROTOCOL buf;
3 s) U! R. j' ^
, J% U# P/ I: n. h* v. G buf.a = pshreRAM->a;
, V- h4 y# Y& \8 N7 v# h1 W buf.b = pshreRAM->b;/ p; \4 T. R4 q. V
buf.packet_cout = pshreRAM->packet_cout;1 a7 Q; E' v4 \5 g6 L
8 G; R: y" o# G, D& h if(buf.packet_cout != count_copy)' _; f% M9 Z5 X( a- |. B1 i! m1 X
{+ p" z, `9 c4 a
printf("a is %d\n", buf.a);+ g- z6 z5 J; G( f, f% j
printf("b is %d\n", buf.b);
+ _" u) J) ]4 t5 H; k& X/ g' Q" \ printf("count is %d\n", buf.packet_cout);( ^% y, ~0 T z1 j8 t
count_copy = buf.packet_cout;& |; Z; J4 a9 s, ?
}& G0 G3 j3 T1 ?
else
; W2 Q2 i" ?5 C6 O- b( p {0 `7 |$ s4 _& y9 k5 N. k
printf("No effective message!");) }5 U2 q% `) w' e7 I1 [7 n' I- {
}; }8 h' c% e) }6 z( K
}: e9 D2 u8 D6 D8 \1 g/ p7 S
* w. f) G# P! {5 ^
$ W( {# q, b4 B& p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 O0 @8 v1 H# j+ N6 o+ g: K
使用下面代码,对内存使用了mmap函数后:2 v# d% @7 H8 A
#include <stdio.h>
3 [" P: P) f B! M#include <unistd.h>
2 t; t# j, H5 Z8 C0 p#include <sys/mman.h>
4 V6 I. i9 _% V9 ^3 O#include <sys/types.h>
: M- |; h+ c7 ]" x1 t#include <fcntl.h>
$ t/ x& l7 e% Z& g. A9 o$ k8 @/ X1 \! m5 [
#define SHAER_RAM_BASE_ADDR (0x80000000)+ F! G7 V; d% L7 w* v: v4 t
#define SHAER_RAM_SIZE (0x20000)
0 y$ H3 w8 a$ p
' S) }, {$ l0 gtypedef struct4 N+ h& J; N5 C) L
{
& i C# C+ }, d. q& T unsigned int a;2 n6 b& I% _7 w1 j! v
unsigned int b;) ]% c! n+ j3 q2 q, `4 Y8 A
unsigned int packet_cout; j \* \$ I, N! g0 d( C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- h, k) G5 S" _4 Q# @) z0 h
. F) s( z! Q4 [4 C( Y! |5 f
void read_MSG_buffer(int *baseaddr);
& L, Y1 S, ]$ [& p/ G8 |unsigned int count_copy = 0;. G, s' Y; {% u7 b# V
* V2 \% g* `, T2 i( H, J4 ?int main()' |% @ R: N! d: g0 P$ {# |
{) C8 h3 r. E# w: u
int fd;
4 Z; ~, g7 u- k; J' x7 _ int *mem = NULL;7 j! o7 q! u- @4 |5 Z0 W+ v! n/ d
" n ~) v& [; Z- t. X
if((fd = open("/dev/mem", O_RDWR)) <0)
) L1 l+ J+ p+ N6 h d7 {, p {/ c) [7 u/ J1 b3 m
perror("open error");
' k9 L% A0 n% Z0 R: W& [ return -1;
$ d0 ?, F' P4 K2 y }9 p, [4 ?& L9 }8 r
( v& q3 M1 g9 h7 Q) E" `7 h L mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 G6 Y3 U) `$ G, [
. M2 c9 r- t( {1 Y while(1)5 {: q3 |: B) X
{
6 {9 |7 e3 F( ~! c! W1 Y2 z* ~0 F- k read_MSG_buffer(mem);
$ H$ a* y" w& @- k' k, ^ }
" K) B* e, N0 e' L}
: I) g! u, O* A; i3 X. y6 ]1 v a |7 x
void read_MSG_buffer(int *baseaddr)/ V6 o) J# v9 s8 o# G/ y, x
{. Y6 k3 E6 J% X _& s5 c. r9 b
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 W6 r7 S- l7 H/ Q6 z1 A8 n) r6 J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! c4 y6 o$ u0 c# Z! k/ N4 h5 \
% W/ m$ S) N; Q0 f4 H' } if(pshreRAM->packet_cout != count_copy). M# S# Q# A1 w# ~! Q3 z
{
) j" {% I5 s* c8 E# [ printf("a is %d\n", pshreRAM->a);
4 F* j2 h3 Z$ F4 k* W( S2 t6 ^+ f& y printf("b is %d\n", pshreRAM->b);
* a% `) w& @; p/ }# S7 z( M w printf("count is %d\n", pshreRAM->packet_cout);
5 W$ U$ A) U# P& H count_copy = pshreRAM->packet_cout;- ~: Q6 ]* A7 O6 ?/ `
} U5 A" s3 f* a' w
else( z" L8 {. @7 l6 d4 w
{
/ e" k) V1 z6 b' W+ { printf("No effective message!\n");
! U0 Q0 x( G }+ x }
) p! ?( X; L9 v6 E* H1 w7 Z}
! Q G- H$ |* C" i z. v
/ A& H- p2 D3 w* A/ x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) o/ B5 c7 B8 S! T7 T0 I
3 M/ {& z, r( d1 A, ^/ T% T* n
# O" C ?* d+ F1 c. D7 g% E5 |4 B0 r' i5 V
' r# h; p' {; l g j) i |
|