|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& J$ g2 D8 M. O3 C" a [2 ^8 q9 D3 t7 N- L3 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 k, F1 X" e: u" T#include <unistd.h>5 L1 o& A/ b# r4 o
#include <sys/mman.h>' e. @5 ]/ b8 u$ y! r% }
#include <sys/types.h>
5 y5 M- W! W6 W: n* P#include <fcntl.h>
$ `. ~2 T& G* [7 l0 f% C1 K0 N5 q& d" v$ M) J. k ?+ d, o
#define SHAER_RAM_BASE_ADDR (0x80000000) # Q$ @( s3 ~( S8 S0 j8 O4 E& ~3 z
6 t- i1 d" U1 W/ V4 y+ | |typedef struct
4 M/ {# N2 ~- p+ Y{
5 r* @) F. h% l! c/ W/ M unsigned int a;/ H) ]; s _) O5 `1 K
unsigned int b;
+ X% n' _: ]( U unsigned int packet_cout;7 Z3 X" P% E* J4 t8 Q6 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 k* f' @, y% i
" G8 J& I5 B- z2 ^+ `7 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 k$ T* t, ?3 G8 S' L/ y% Kunsigned int count_copy = 0;% y, r' K& A2 A& Z( p A, H
- ]. |# }6 ?, F E
8 I( B0 G7 i$ e
int main()0 x: E3 N9 l( }2 s5 E
{
6 P) H5 E0 n, M; z, p' w+ m- V2 T3 q+ F pRX_MSG_PROTOCOL pshreRAM = NULL;4 F8 K& L0 T3 G8 G& H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ _* Y3 f8 G; B; \/ e f" E; M& X' S! w& ~& C
while(1)# h) M$ l5 x! ?$ e, g0 H
{
. a3 q8 B7 }5 {4 T5 J! b3 q read_MSG_buffer(pshreRAM);* [9 u) u+ h8 f- b0 [
}
/ X0 j9 }5 T$ I# S# | a1 ]' w5 e$ g' I}* K/ [4 M% _8 A, d* ^, v
# P0 w3 U; M) z4 B5 b: J8 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) j& e$ \8 Q4 t1 T3 e
{! |4 y! [8 j. T- j
RX_MSG_PROTOCOL buf;
; M6 \3 _/ J1 ^+ v# b
6 Q, C. n; o3 J% A buf.a = pshreRAM->a;) ?5 r8 j) d' S
buf.b = pshreRAM->b;
: P# s u/ g1 n1 f# w buf.packet_cout = pshreRAM->packet_cout;
# j3 `- Z0 e' I0 {
! H* B. v% ~8 Y3 j. t0 _ if(buf.packet_cout != count_copy)
" m0 k) g5 y5 Z8 f {! `- h, E0 Z: Y1 i/ \
printf("a is %d\n", buf.a);
1 t! d: W, \8 e0 h$ k' C6 ^8 E: g printf("b is %d\n", buf.b);0 i3 z3 O' E5 m0 w; s8 `
printf("count is %d\n", buf.packet_cout);
$ w! E6 t- B7 n, K) @$ i. C count_copy = buf.packet_cout;
- A4 Z8 K9 K" G# G: ], w. _" Z }( [1 e2 a6 r9 h
else4 w9 N8 [: q6 w3 D) @
{
. @! K2 R/ V- M4 Y* B! m# l printf("No effective message!");) |+ m# U# r+ ]% w8 t5 ?
}
0 O% {; D" ]% N* y}, V! E0 b( E7 o2 x
/ u- b; X' S7 E7 Y! j; g0 X0 B G- K% u3 m$ Q2 R# y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- z h% e6 ^% r3 o& _. @# g: m6 _
使用下面代码,对内存使用了mmap函数后:' ^+ J, d4 ?& M* Y( u
#include <stdio.h>
! W5 v5 w: A2 L ~#include <unistd.h>
# A% j" v/ Y, G+ q4 ^- ~#include <sys/mman.h>/ P0 N& [9 y3 K0 J& y E
#include <sys/types.h>! d& h7 X) e1 G% U% R
#include <fcntl.h>. Z! Z$ E) R# a# ?
( L- q* i1 l& D4 S K6 [3 u$ J: U
#define SHAER_RAM_BASE_ADDR (0x80000000) O# e1 G/ q! K5 z" H
#define SHAER_RAM_SIZE (0x20000)
. E: T7 F1 H6 ~, J1 w$ T
: q5 u5 r8 h& W* }7 j: M4 {4 ktypedef struct8 l: b7 K) l2 }% p: w% U
{
+ y" {( @0 E _6 s( v, q+ G unsigned int a;# W" X9 [ e( I% p0 K" W
unsigned int b;
; Z5 d% x1 m6 g5 Q$ U# ` unsigned int packet_cout;
+ _9 L! ]1 N& X4 G" ?2 R. \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% K2 u( r, J6 M" z3 u
6 @8 U) P( X& \2 ~ v) a4 l0 tvoid read_MSG_buffer(int *baseaddr);
: u$ M3 `7 N! ^8 h% Junsigned int count_copy = 0;
- z# a P" t" a( @- A
+ ]6 m' ^9 [; Uint main()
9 G( H1 n# Q+ Q0 o+ l{
/ B8 [3 K4 ]! B' r7 V int fd;
6 H) |2 Y' ^/ Q/ W$ \; d" Q int *mem = NULL;
2 x: q& O5 n+ N! T1 W) ~ ~0 u; z( ~8 z
if((fd = open("/dev/mem", O_RDWR)) <0)! @. k* q8 X) s# Q, @" s# E
{
' {* B2 R' W: `# ^/ N, i* f perror("open error");: o7 J8 K2 {# C5 E0 \4 ~/ }2 j9 l
return -1;
1 O+ L2 `* [/ W# U; s3 o }
; ~# @7 | t. s1 i* z) ` - ~/ L7 [( C* u) V; R6 @# l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- P+ Z% i+ W9 Z9 ^% S
# s* A, a8 q' z+ p- P
while(1)
1 C5 `! G5 R! @5 x; h$ D O {
- J" u+ e& r" M9 `. t! G read_MSG_buffer(mem);/ @/ `4 _" O( U( A- C4 A$ q
} 6 w/ y, A; ~8 X/ B3 ]6 x
}
0 ^5 `2 P+ x. i5 m8 l9 @) _6 [
x% W) Z3 Y" f" w: Uvoid read_MSG_buffer(int *baseaddr)
* M0 W% i, z) R' P* D1 T& C: Q' @{
; e! d' o' D7 z# h K+ L# \7 t pRX_MSG_PROTOCOL pshreRAM = NULL;
- F& Z; s. Q, _2 ~$ I1 j! ]' P$ T; @; H% m1 o% X
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# z) m7 ^4 i8 D7 S
1 e- ~& W1 x8 B# c if(pshreRAM->packet_cout != count_copy)% V! V5 G; O' k2 m
{
, Y0 K8 K- @$ X# t printf("a is %d\n", pshreRAM->a);
+ { o! N! X k& n. M( f9 W$ V9 j0 I printf("b is %d\n", pshreRAM->b);
6 r# u. K6 s9 b* E$ Z5 I2 h- ? printf("count is %d\n", pshreRAM->packet_cout);
! F5 I4 E# Q* ~ count_copy = pshreRAM->packet_cout;7 t R2 g0 c: ?: {/ M J- \
}
# A/ z5 M3 t5 D1 Q8 z6 m else
8 I; K, W; A( Y& d+ E {
) @! J4 a$ ^6 y( g+ W- e. ^; s printf("No effective message!\n");- O: l* j% U4 u
}* B" I) l5 P3 j# z. S
} d) m8 N, X+ ^( W
: J+ M6 X; t) f+ D2 ^! V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 G' y) R3 q0 v# J1 n
, G' u0 ~; e z, R$ S# u7 ^% v2 l9 ]- m8 N) I* E# h
# [# q" s3 I( I' z) T
* S: ?# \0 D! b& d
|
|