嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# f- e' n; V. A
) v* |: [: X O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 }3 K& P) G1 r" D' r* o4 P
#include <unistd.h>
7 J0 ^( y3 ^1 O1 n1 t
#include <sys/mman.h>
, i; v. T( P. o2 ^; p
#include <sys/types.h>
3 q' W8 W' M R# D% g6 O4 B
#include <fcntl.h>
% {- H/ M0 x$ x [$ j
8 ~( L9 t) L0 B' j7 U; S
#define SHAER_RAM_BASE_ADDR (0x80000000)
" G) [) P. @8 _+ ]7 B8 R* G
* v! J5 Q! j( P; d _5 g
typedef struct
. c( L2 ]7 K, q( w$ `% L
{
& i7 K1 Q$ p+ |0 t8 d
unsigned int a;
, T/ K O$ y3 i
unsigned int b;
; g6 I/ a, v3 j! O, U5 }
unsigned int packet_cout;
* g4 r4 z6 z- D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 X5 j, }6 y( o$ r
; i; _& _3 w! O3 v. j% G* k |. w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" |4 V, q) H7 s% l a
unsigned int count_copy = 0;
" y1 w; ]- r% F
7 {0 ^2 }2 n R
4 z/ G$ |7 G1 g: u' N# u
int main()
m/ |. l, K+ N! J
{
, ^: W; e" [& @9 G2 H0 A: v4 y
pRX_MSG_PROTOCOL pshreRAM = NULL;
" U) f t- n2 l. J* w2 Y$ _; f
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 _, y8 j s& Z- v/ F" w# E+ m, ?
- b9 P- r! S& F1 p
while(1)
- |- ^0 e0 [- I" W$ ~4 A
{
9 ]2 c4 u5 H* {% E
read_MSG_buffer(pshreRAM);
( O" c) E) K9 s( L$ }1 r
}
) c) i+ a y9 c( }
}
) P" M+ Y% N- a2 l J- l8 C3 w
/ S9 R! K1 l) p ?( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 s: _7 p' u- r/ C( @* b# m
{
0 b- S% L8 v1 {; z3 z i
RX_MSG_PROTOCOL buf;
( C; z1 O l1 b# H2 d/ E
2 p* j& d* e8 x J1 P2 [$ I4 |; \
buf.a = pshreRAM->a;
6 D1 P m6 f$ V3 R* e2 X; m8 n
buf.b = pshreRAM->b;
; H/ m. k" t4 }7 u
buf.packet_cout = pshreRAM->packet_cout;
9 a4 L! d5 L: _4 s. z- ~
) b' l; {# a& ?: N; M5 r
if(buf.packet_cout != count_copy)
8 C# T9 u: K2 ?8 m
{
! n8 X* T8 O4 ]- Q; j' ^
printf("a is %d\n", buf.a);
! M& a/ ?7 c+ i! |$ |/ N( H
printf("b is %d\n", buf.b);
; o1 s3 [% v" }$ A1 b
printf("count is %d\n", buf.packet_cout);
- z: G( i( a+ b& `
count_copy = buf.packet_cout;
8 e& d6 `4 d" j) y" C5 c
}
. w2 a. a/ Z) V: M2 a) m- E7 i
else
4 f, a! R' ~6 [- J" y" I1 B u9 c5 ]
{
. _# V' T* c0 N- G1 g* F2 I" |
printf("No effective message!");
+ y5 w$ t! o0 J) S0 _, N
}
, E6 J2 S7 d" H( p8 {* }3 G
}
( C( [) N! s! g: |6 W6 X9 L
( k+ b. o P% F) n& D7 {8 Q. W% U
) K0 u' o2 x9 p( a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! x2 r8 H3 }' q5 h+ z9 {4 a
使用下面代码,对内存使用了mmap函数后:
& b' M4 Z: S8 L% A4 p
#include <stdio.h>
, z$ Z4 x) u) g' U8 D0 J; @
#include <unistd.h>
3 ~- I9 Q I! O' e- o0 l- {9 [' Y
#include <sys/mman.h>
" C) _' R( ?. I; J R( ~" @
#include <sys/types.h>
! M/ }$ r, r- V
#include <fcntl.h>
/ N% M; w0 v1 h2 Y+ K7 V' w0 R
# h a3 F" h" B
#define SHAER_RAM_BASE_ADDR (0x80000000)
) X- f4 z9 n; q% s L) u; {
#define SHAER_RAM_SIZE (0x20000)
+ s9 K& C h7 S+ f1 q0 o7 _+ `
/ E2 I( f/ S* Z" K1 O* a" P' }# [
typedef struct
% y# v/ b1 n5 O2 k) {: r9 ]
{
( D. X7 C" W$ w. M8 A9 ~" W" B8 D. |
unsigned int a;
* R6 N ^0 N- [/ Y( L
unsigned int b;
& c% C' _, R. }2 ~& y9 Q
unsigned int packet_cout;
7 q+ x Q8 H( V1 J d1 p! r! @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" I6 M: V6 k, I4 q
X) \. Q% r% H( v1 _8 L
void read_MSG_buffer(int *baseaddr);
/ z* A. D; |. [
unsigned int count_copy = 0;
1 D9 t: m1 |- X$ O/ p6 s+ a
/ T6 \8 U0 m/ u% y5 i) d
int main()
. t' D" N% O- k2 g8 @, h: \: D! g% J
{
5 u. U! ]3 z4 ]# o9 G- P) @' j* V
int fd;
3 d- J( }+ K* l
int *mem = NULL;
% Q/ n) S4 ~+ J# P) B$ K) }
, i4 M4 U: d8 s; S. {4 f( s; i: P
if((fd = open("/dev/mem", O_RDWR)) <0)
1 w; c; L+ F5 y) c- x3 H
{
' R9 O1 W! v# O, |; l6 ^3 |/ N
perror("open error");
6 I" X* R/ r8 K6 J0 }6 I9 z+ |
return -1;
t& e0 p" \0 m
}
5 ~. F, m1 D$ E4 A
0 _7 @. p0 C4 T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, U( T# \% x# a/ ]( V$ {5 n
* Y4 ~: M2 Z# L7 }9 j/ P
while(1)
/ t' x* s3 B, h. A, w. {0 p
{
- L2 K9 k' K/ M$ k
read_MSG_buffer(mem);
# h8 k h0 |) u% V6 B+ J! C: `1 D
}
I0 S7 u. t# Z- r
}
4 `- P" e8 q/ D$ N6 m9 d
: y# d; i: z h3 D2 I1 h" W
void read_MSG_buffer(int *baseaddr)
4 s3 r5 [2 V0 H! X) ~ ~8 P2 [
{
3 w5 K9 f. W2 U8 M8 n
pRX_MSG_PROTOCOL pshreRAM = NULL;
& h6 `; }: O B0 s
0 V8 f% ~: |# j2 ?$ R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 m* ?5 n8 U1 d' J$ g5 q1 h
+ X! W6 p; ^$ z' d" J: u6 n
if(pshreRAM->packet_cout != count_copy)
, u( X( q2 F. L( H) P$ J
{
' P. Q% f4 U5 x6 N
printf("a is %d\n", pshreRAM->a);
# T: u' k- T! }, O2 Z6 l2 y! K
printf("b is %d\n", pshreRAM->b);
: F( K' B. [! Y8 [4 @8 c; S
printf("count is %d\n", pshreRAM->packet_cout);
& Y0 @ t# B! L) k0 B
count_copy = pshreRAM->packet_cout;
' d. K1 S5 O- |( v" t4 v
}
$ P' W2 A% [0 K- \
else
5 H: j4 R3 w- C5 n6 I- b
{
& F! F8 c/ _& L" p0 C
printf("No effective message!\n");
4 \. v: X4 x# d8 \% |
}
- t# G. M2 B9 @: d# p
}
: a& X8 w8 `6 ~" @0 P
; `' D2 L% \3 d4 Q4 S- @4 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 v ~1 w: X4 ]+ U S
) N" O9 f4 x- c7 X8 w0 U
2 I4 [/ H& {, _! c5 o
8 x# N2 ]8 H$ k3 V( \3 M
6 Z: j4 h. D+ D" }) o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4