|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 M1 U; w3 {5 B( x7 A: r3 s5 R2 }5 _- T0 |5 R. k- m7 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 {# G# R, t6 ~% H#include <unistd.h>
: @4 N! X& D% }$ @#include <sys/mman.h>
% c, S! g# r; @$ @) J) D#include <sys/types.h>
* U" K) v! {; N1 p. y- D#include <fcntl.h>
6 c: F5 Q% k& h$ A+ Q' M7 j
$ o& x2 o. ^ }7 Z- M#define SHAER_RAM_BASE_ADDR (0x80000000) 6 I0 z, k& h/ b; T
( F# t# K! Z0 ]' N
typedef struct& Z) H5 c1 g; y6 E/ }
{2 j9 ^. t! @1 T$ V) r
unsigned int a;
1 \( Q, s" K9 X, v unsigned int b;1 y5 u. V; j7 b6 j# ~- e0 L
unsigned int packet_cout;
( X: }- h# `- c5 o) T! P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 Y$ r( n" ?! c' }& u
) \) j& b) C# j4 K i1 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 E; A5 B# o1 h/ ^8 R5 \' B; ]7 {
unsigned int count_copy = 0;1 _& o- @- D; L
% s y: a( K$ |* h1 A d5 M$ g
, q/ S( v/ v) ]int main() }, G1 _* i6 k! ?: G# v- K
{# o! ^/ s5 K0 N1 v3 |
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ h8 H- ~8 t" _& L' b, p pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- @" X, }% _% d" ]) N
/ `0 l; U8 M5 }2 C while(1)3 O1 s- w) g! d5 C6 _
{
4 S# x/ w" u1 j& _- _ read_MSG_buffer(pshreRAM);
! |1 h, U. ]+ R5 N# T& q3 o }
7 Q2 \) F/ E% |; H: f7 M' ?" }}
" a3 D% } p- O: F, [" ]; d. h! N4 i; R! g" [1 a. X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, W: K2 u! N; ]7 z: T$ u1 e d{& q; D6 g. D4 t; y# |! A+ E
RX_MSG_PROTOCOL buf;
8 {3 y1 D& [8 d# ^9 i, n7 R - a/ g, m; N4 d. G5 _
buf.a = pshreRAM->a;- A0 [) |- ]3 i5 d7 z( X
buf.b = pshreRAM->b;
- D5 }& f: m/ _ buf.packet_cout = pshreRAM->packet_cout;
_2 g+ q* O& @
6 D+ F. f) c* u if(buf.packet_cout != count_copy)
8 q: o7 A3 I: y. s' f) s+ d2 T {$ y4 d1 |) o* K. [8 Z. Q
printf("a is %d\n", buf.a);
* g0 h p% x+ U, @ printf("b is %d\n", buf.b);
9 S A5 R* E# Y printf("count is %d\n", buf.packet_cout);" i. ]8 `# t8 \4 s7 v
count_copy = buf.packet_cout;
) b9 S$ ~- B. W4 ^% O2 m }8 f4 p q7 V+ W8 R5 V) ]/ _2 u! k: w
else; p4 _0 S% i- u) v
{/ \2 T2 r2 s: @" z: I! e! j' E
printf("No effective message!"); y4 `8 U+ j: k( t {6 u
}8 m1 D6 F2 p. J& [# J/ `
}& ~& H6 o3 Y. I/ y9 o
; b& `1 L* f. A& _: y/ c
& c: p( C% @2 T* H- A" H$ Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* |# Z' w E) z( r7 ^使用下面代码,对内存使用了mmap函数后:
" ]1 B. e) O& a' f. d#include <stdio.h>
( |/ G/ v3 ^4 I" _* C. g6 U#include <unistd.h>' L% F0 Q" S7 N4 B, |
#include <sys/mman.h>0 H" K9 b* W5 D) B! D5 U8 P4 ?
#include <sys/types.h>$ y, d$ z2 O p$ n" o
#include <fcntl.h>: x1 e+ }& [9 U* G
! q& y; h7 a2 ^- x2 ~, g#define SHAER_RAM_BASE_ADDR (0x80000000)& F( b4 {9 w3 Q3 F; b9 f2 v; U% s/ k" }
#define SHAER_RAM_SIZE (0x20000) 7 b" O( B8 Z4 K5 S* Z% ]. w
( E! H [" ]( J+ r2 z7 Ttypedef struct
8 c) [; @4 D* m8 e" u& }1 E{
0 Z! t& ^' i9 s5 I unsigned int a;
6 J7 x$ J$ ]# p M4 ~% Y unsigned int b;2 l% B: g( g' J
unsigned int packet_cout;1 R$ n( w8 E( f4 t, X3 {6 S2 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ @4 E# t2 J E( W1 a6 Z! B/ f
' o k( B0 \9 z* Q: }' C1 E
void read_MSG_buffer(int *baseaddr);
0 Z6 c c8 }; l, Y0 M7 w0 }8 [unsigned int count_copy = 0;0 _0 ?& O6 c/ Q, \
# x& N. H* C& ^" M5 S5 A* H
int main()9 ]* T4 t6 L% v! B, s- y/ J
{
* S8 [6 G# B, I4 {$ u( [6 n int fd;! n$ X$ F5 w! e# R2 _
int *mem = NULL;- w' d, R$ V" {: u8 H5 o+ J5 y
) |3 ], n; S; i
if((fd = open("/dev/mem", O_RDWR)) <0)
! a* \4 w: L# S9 A$ h } {- J. ` W. p }# r
perror("open error");) \. D- v1 {) x. Q
return -1;
; _, }# H7 k9 l8 Q' u/ ?3 M6 ]1 L }, T T0 }: W: r" n) ?! q2 c- s
% v% q- ~# Z# ?6 R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 g. y& c. |! V/ y' r1 q1 j4 j
K3 r B- k6 V5 s2 ?5 O5 j: { while(1)+ u$ ^' F3 q; g
{ A" Y9 Y3 a. p8 v* A' v! M
read_MSG_buffer(mem);
0 R' Z+ r+ @* L7 f- O }
9 ^( l* q8 E' ?* p9 [}# A+ i1 J) o- x) J" Q( O( k
( N: }9 K6 j& C$ Q7 A( T- ~) zvoid read_MSG_buffer(int *baseaddr)
l, b+ [% _) o) O3 Z- O{
% V1 `, `0 X6 T7 M$ n5 O% ]6 }9 K pRX_MSG_PROTOCOL pshreRAM = NULL;
0 \: a8 Q5 C# r; S# m& h; Y7 |+ M! S$ Z3 o2 @1 M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 M0 R% X0 } D
3 L, m% @( A7 b if(pshreRAM->packet_cout != count_copy)% n: o+ g! ]( i, v* ^0 E
{1 {# \3 ^& P, Z! r
printf("a is %d\n", pshreRAM->a);
! m! c4 F, l- [8 o printf("b is %d\n", pshreRAM->b);: m8 O8 I: B5 P2 T9 @, C& Y
printf("count is %d\n", pshreRAM->packet_cout);" g; t' o/ [0 w: [8 T, m
count_copy = pshreRAM->packet_cout;
% D* f* m1 G9 L6 n( {5 n+ {6 t }
0 B) J, T7 r0 g" M5 P7 C else
# ^" F9 F* D; | {
1 y7 U& p4 w( Z! u' l printf("No effective message!\n");
: w/ Q9 Z2 f1 l/ w8 } }) Q4 J) H2 j) F* c) p! o
}
1 I0 h: W- F! Y+ U; t/ i3 D9 R* k: _4 l- x# l7 O: d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 Y6 a/ w& z5 K! ^& r2 t, Q' {! `! I: ]' c! @6 o, p) i, h
! p2 v" u) V- T- i2 S: [: c$ P' Z1 x
& f5 b% ^5 u! f4 t, U
7 S+ z p* L1 N4 h s |
|