|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# E! m% J* r! L. \ `; F7 p1 K0 z
! E7 s7 }% U! ~% J% j8 C" oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 d# h8 A; r" C7 z1 I, Q#include <unistd.h>9 h9 g5 R/ T; `% Z3 x
#include <sys/mman.h>
|- t0 |& ?% C5 h# E P6 O#include <sys/types.h>
; T- J5 o6 d" f1 I! d#include <fcntl.h># J) f# [3 j' N) N; }
6 g% R. V: Y0 l0 c: G#define SHAER_RAM_BASE_ADDR (0x80000000) ' H7 U. P5 B3 g4 D9 `/ {( U: q
: F8 b+ U9 P) E E2 H) f% D, o' Atypedef struct+ y9 c) L0 Y/ u5 ~- w' I
{
% m2 Y2 M* H1 r& Q unsigned int a;
# m+ `: N, S6 l, }# i: b unsigned int b;4 g! E# U2 {1 ~# l
unsigned int packet_cout;
3 y8 J3 i% L. k, w0 S) W( z" Q* }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
e9 [* p1 g4 B
! c- X$ f+ F( r4 H( T; [: J( g: ~% w3 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, @7 N$ d) {. z: O3 vunsigned int count_copy = 0;
% g0 Z3 }9 d! J6 n4 p; v
" {4 L! t& R0 [: h) m3 t$ r3 u7 L& Q$ \/ j
int main()* Q, K5 [' o7 h7 q! Z4 p
{
- P& T) x( B5 q+ i! x& q1 ^ pRX_MSG_PROTOCOL pshreRAM = NULL;
: f7 ?) T6 ~: ^) R8 ~" J pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ K* ?3 s. w8 p$ Q
2 T' f7 u' O. s- W, Q: |& a. o
while(1)
. Q% G5 q8 e7 X {0 y& f2 k3 f/ |) q$ a! w( j
read_MSG_buffer(pshreRAM);9 s# p6 @; W$ o. s/ ~1 w
}
1 d& |; m' s. [* |7 e, h}
" E7 A# x# ?: I) n* S* M# a
. |- u+ e- }; _* k) S+ `6 L' ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 W r! w; u: M0 w
{
9 ^. }1 Q6 a3 p+ _4 L RX_MSG_PROTOCOL buf;: b Z8 C- m, s- ~( G& | ^
7 k# H" V4 g: J v buf.a = pshreRAM->a;5 j) I0 h8 _# q9 O7 o, h
buf.b = pshreRAM->b;
8 ~7 Y$ @2 o9 ` ^ buf.packet_cout = pshreRAM->packet_cout; F3 `' ]# V. K5 _) _) K) \2 P1 b
$ M' a' e* h; g4 S5 a0 {/ Y/ ~
if(buf.packet_cout != count_copy)
1 P# Y1 U4 n* g9 z. ` {
- N6 Y5 W8 A. C0 @2 | printf("a is %d\n", buf.a);
, A: w1 J0 \4 J! z: L8 ]: U printf("b is %d\n", buf.b);
$ q- |6 b% \, c4 W, H$ R1 N% } printf("count is %d\n", buf.packet_cout);7 }* L. u. b: R# w1 s
count_copy = buf.packet_cout;
4 u3 e: F, m) |. r4 V0 _ }
6 ^% v* z2 k+ r' M; F else/ Z! t+ d9 Z) h9 x1 y4 d' R2 W
{
! B& q) Q9 y9 q! M printf("No effective message!");* I- r8 P6 c$ V+ C2 v1 I
}2 m4 I/ J5 U/ f1 |
}
& g* Z3 F+ Q" u$ n& y: P' g8 g8 c! A& u2 [* k# w
/ W( Z; L0 P! f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 e7 M6 s& K9 N. e6 L: A$ V
使用下面代码,对内存使用了mmap函数后:
- N8 Z8 O Y! a+ {( G0 _1 H5 v#include <stdio.h>+ o0 Y" h1 ?8 [* I9 H
#include <unistd.h>( N* T5 f# T; r; N+ `: C
#include <sys/mman.h># U) h1 B' ^ ?* s
#include <sys/types.h>2 ~' G" A* ~4 k* r. h
#include <fcntl.h>
/ d" ^4 \2 u2 P& P
0 F. Y5 s, c6 J5 w6 ^#define SHAER_RAM_BASE_ADDR (0x80000000)7 Q) t& |. J; x: B5 P9 l( m8 D
#define SHAER_RAM_SIZE (0x20000) 6 p0 T* J" X1 j' ^; J
: t- |2 g$ i, V( {/ z6 y
typedef struct
; W2 f- Q9 H; S; Z. _8 c{! h- z2 @, k n
unsigned int a; H2 g" d# @' p# f+ Q
unsigned int b;8 Z9 s% k+ A7 Y6 Q5 Y
unsigned int packet_cout;+ e0 ]/ U4 N' K$ w5 g0 Q2 r- m5 c' n3 [( H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; [5 P8 m: `% e3 e! A
# O+ C, f6 b% v8 d! L: y1 E# E7 i+ Vvoid read_MSG_buffer(int *baseaddr);0 h+ q9 u M4 j% P7 x
unsigned int count_copy = 0;
) [2 L! {: |' F, T0 o3 q8 {6 F& |
int main()+ ` O B: X9 @1 R1 T7 F2 J Y
{
! i( t4 `* B6 Z) y: C! ^4 {" q int fd;
1 u8 J0 k. Q8 r/ H& P+ X: ^' G" y int *mem = NULL;! w/ I2 E1 j9 l- g% ^. u
2 P; y) z2 q3 `& r8 h8 J
if((fd = open("/dev/mem", O_RDWR)) <0)' i8 {( a; p2 X) U6 g u' O
{4 H8 G, [6 f5 w* W4 g, M
perror("open error");
2 z. g# I( q% I7 I return -1;
h5 D1 _* T1 v( h$ V6 V }
+ a' v: N9 C) f% y/ L1 X; g
7 W- s$ a( v4 C' |! d0 E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! a6 e6 K9 ]9 _3 c% P
1 h2 |6 Y( o n- D* A/ ` while(1)
7 v. s5 R: C. k {, n) a+ } _. Q9 o) A
read_MSG_buffer(mem);/ g: B% P" I: d W* W+ Q. R
}
7 p6 l! L4 B6 }7 T' q/ U4 q} v r3 B; I& o5 V, W
5 b% f5 `- a8 v* p+ |void read_MSG_buffer(int *baseaddr)
' I. m3 S5 r. `/ x; t{
0 ~6 `+ @5 f' {* X* | }+ g* D pRX_MSG_PROTOCOL pshreRAM = NULL;
8 I. J9 Z4 l8 s0 {5 _/ N6 C1 t. U
, m. N" J$ k3 M" ~ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 I* w, v/ w; b) {
) Y# f* ~, y( \6 Y7 E# q if(pshreRAM->packet_cout != count_copy)! N' z; e- f3 R7 W: G
{
+ b! q4 k# g2 |2 [9 q3 x; T3 L printf("a is %d\n", pshreRAM->a);7 G4 u5 m; m+ v$ a; p6 Y( P
printf("b is %d\n", pshreRAM->b);
2 K( [9 P# w8 g. ?* g printf("count is %d\n", pshreRAM->packet_cout);$ D+ y- i/ F8 c
count_copy = pshreRAM->packet_cout;/ s F" u4 m+ [ U/ L' @
}# ^; n1 n! W- T/ ?, j* j! \
else
+ B- S, U _0 @5 ^) Q {( @0 j1 a/ c# |
printf("No effective message!\n");0 s& l7 e6 P" Z3 X' U% \
}* z- X* U9 v+ |2 i7 n% C: h
}+ F7 U7 P. C' T1 C; A
; F/ X6 n/ i# I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ]( O# M9 s8 F8 E5 ]" A: T# P m
) T0 `( e8 |$ g. k
& C1 g# \1 B( }3 G m0 U1 i3 |" g7 d- W7 `, G. V2 x
! T }* u$ t/ t' Y ] |
|