|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ C& n7 u% D. J
% Y, {; ^" }( |4 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ \0 }) m+ X8 E9 a* g' S4 m
#include <unistd.h>
! {$ q5 C0 x- N; P$ @#include <sys/mman.h>! J- |! B1 N% t {) R. V
#include <sys/types.h>( a, O9 q, @3 a' b% ]
#include <fcntl.h>9 j0 v* i, `( c5 b
3 U( P! l* q2 E7 X" q
#define SHAER_RAM_BASE_ADDR (0x80000000)
% I" R6 f% N0 E) q6 M6 B: @$ ^- f! N' U6 D H# z/ C
typedef struct) q# y( H- E6 U
{
$ s( M) p2 Y; C+ L* l unsigned int a;9 d- D" B% {3 l- D
unsigned int b;% B$ a7 S' n+ W, |: r+ t8 m
unsigned int packet_cout;
! w& V8 R" D0 q" }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" `7 J- b/ ^% p& d$ E ?& A3 i
: B" X, w% g, u* Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ e% G/ C7 x9 j, j0 j2 h. cunsigned int count_copy = 0;3 v4 P9 I0 p2 k# D% X) \$ p
; \& b R) q- }4 {; p( g& G! n$ k3 P/ v# W, X& I: f
int main()
* Z; Y$ w, R4 V' H{% @3 L0 x. d1 c' ?
pRX_MSG_PROTOCOL pshreRAM = NULL;, z( ?( z- u$ m; P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" j4 p; T0 B9 t
* p& Q/ A2 w7 ~" t0 X while(1)$ f( H- J1 g) j! d
{8 ?6 I% G' f; S; U8 Q
read_MSG_buffer(pshreRAM);
, }0 `( J# z) o0 j9 B% w, G } 7 e( [( N0 T9 N- F3 c* t
}* u! Y0 C0 G$ p$ v1 }5 R- d
4 k: u8 s8 _+ Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): s. R7 @- q; M }8 ^) v- a
{
1 n* i: n- a5 Q5 h. L( T, o RX_MSG_PROTOCOL buf;
2 `3 J: f! [, v) h4 o# s$ d ; z9 F3 x( s& R# R+ J* u
buf.a = pshreRAM->a;3 \) n# e6 Q! W, Q* }8 O% p3 ^" r
buf.b = pshreRAM->b;4 ]0 B# F. A$ T! ^% e
buf.packet_cout = pshreRAM->packet_cout;4 G7 h6 J k3 i6 K
( K' _5 Y- u; a0 u
if(buf.packet_cout != count_copy)
8 _5 ?. d: I1 m$ }' A5 q0 _& p {
4 E, \% V! o: n+ [ printf("a is %d\n", buf.a);/ f4 t5 _0 [7 {0 U# A9 b& a4 G
printf("b is %d\n", buf.b);; U5 W9 C% w; h& W/ u% A
printf("count is %d\n", buf.packet_cout);
5 e6 k V8 c6 K count_copy = buf.packet_cout;
0 ?) w/ m! Z5 l% ~2 p% v }
& ?# v0 @7 Y/ r7 |& P else
+ g1 j' n7 r; w7 S {
4 R8 q+ _0 ]9 d* l4 k& n printf("No effective message!");
- z s$ E( q; O! A) g }5 \ D4 Y5 i6 C, ]1 E
}
2 j& m# t8 G+ k& h- W' l) ]* r
. w: p; e6 f" c# P
/ j, n6 F' \; Y- O8 R b. L/ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) u( E8 F; A" j- I* N使用下面代码,对内存使用了mmap函数后:
; V9 \4 C; J4 T#include <stdio.h>
5 p& |) |: y0 K, E, @$ c" Q#include <unistd.h>
; S# P' B$ \3 n9 K+ j2 C#include <sys/mman.h>
- X( b( T2 N2 I/ b. j#include <sys/types.h>
6 p4 L6 G. r9 ]; L" ~1 W#include <fcntl.h>
8 F% T$ F' y) i6 @. S# E3 H
2 |$ ^" i' S: G#define SHAER_RAM_BASE_ADDR (0x80000000)- s, Q, y7 H7 u, U6 K' M$ R
#define SHAER_RAM_SIZE (0x20000)
. l g: z6 ]; E/ ~+ c, m, K# e/ w" [
typedef struct
; s% l+ P5 J3 D* W- m% m3 l{8 F) ~# f/ K4 c8 R8 N
unsigned int a;
2 _4 V. U/ O, C ]& p9 @/ g unsigned int b;2 i I0 d6 O' i/ h& t! w( m2 m4 ], j$ F
unsigned int packet_cout;5 h9 L$ j. L0 ^. F9 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ B9 d# i( q; O- _
; s9 f$ g S4 Ovoid read_MSG_buffer(int *baseaddr);: K3 t5 U% X# t% u
unsigned int count_copy = 0;! N: S+ N# K; i. U& B" m
0 j; t$ X7 Z# B5 s* v9 Hint main()
& I, _/ ?; v9 x! @! M& K{! j8 N4 J ~8 R. N, |
int fd;8 N' N+ b: [: u
int *mem = NULL;
; r/ ^0 u0 G- @/ @$ s1 A# X
/ I" M' M Q9 i9 w7 ?# c" X* i if((fd = open("/dev/mem", O_RDWR)) <0)
1 j' }" g* _6 L7 _7 [3 D1 J {
- N* p- D/ U! M* s perror("open error");
5 Q0 [: O, G+ u4 ~ return -1;
+ v! V) Q5 j3 e6 z4 n }7 p( I0 Z1 n- }( Y. R4 b
" u* n7 a7 n: c# y) L+ j! N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 j( e- x0 y$ d' |8 O* F" w
& @6 m. O6 |, e7 E while(1)
0 X" ?/ E1 z1 F9 |. P9 O {/ N" X' t. p V L8 x0 {3 S
read_MSG_buffer(mem);# A) ^% }+ {; V$ G4 P w
}
% |. g. |9 S2 a" Y }}& N( L- s2 Z2 d
9 Z' `; _# v2 W1 j! r& T# y( l
void read_MSG_buffer(int *baseaddr)/ t7 T( G. |. G
{; ]8 T0 ` J# q) i) B" }
pRX_MSG_PROTOCOL pshreRAM = NULL;( I, c8 D$ O8 Z5 k
. X. @6 j+ @2 N. s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ U2 A* z0 Y; M! w3 l ~5 a w8 ~
* ~6 N9 g3 {$ ^9 o if(pshreRAM->packet_cout != count_copy)8 l& D% B" ~' y. L" k
{
: F. {( V# l- P9 ~ printf("a is %d\n", pshreRAM->a);6 ]% i5 x `* z" i% t
printf("b is %d\n", pshreRAM->b);
6 G+ z8 F c+ z' T printf("count is %d\n", pshreRAM->packet_cout);5 _9 k! E$ n7 s( b& Y$ K
count_copy = pshreRAM->packet_cout;
" U2 a6 G: {! ^' G, A9 T, A5 C }
, |$ U y A6 M else' a) z) V. S- T. ~# D; w
{' y; g& x0 R% s3 Y
printf("No effective message!\n");- y0 C3 i- E5 e' y! X2 P% n
}' {$ }+ e! U" i* D
}6 d! _" T) e! V1 w6 e
( k: v1 _) B, `+ }' I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 I! W* I. K. E% r' Z
$ Q4 d( v I* ~7 e# V7 k6 [
( d1 z [0 s1 j7 A, B) Q+ g% L
. B, M8 V1 y9 q9 ]6 d2 R# N4 |. {+ n/ W }7 o
|
|