嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 C- [/ P' t ~; m8 e, W8 l6 w( {! q
7 Q, O8 m5 k" Y# ?: F4 `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' q" C+ r, j$ g7 V: [
#include <unistd.h>
$ B0 N5 d, c$ X9 h0 K) s/ K C
#include <sys/mman.h>
! N+ i- I( Y5 p5 D
#include <sys/types.h>
6 r9 i1 Z9 ]/ m& t
#include <fcntl.h>
/ J! [* B0 z4 g- q; @
2 D! t3 E) O: k
#define SHAER_RAM_BASE_ADDR (0x80000000)
. m: a2 I( R/ a
2 w" D8 T* |8 W4 X0 W% l
typedef struct
/ m" d* h% E/ q
{
/ \& o! x) M7 X& B5 S1 A$ m
unsigned int a;
+ D7 y2 _: e- D1 `' E- S
unsigned int b;
0 {9 x5 Q5 a3 d5 m" c6 u
unsigned int packet_cout;
2 f9 L5 [1 w' G3 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 [* Y+ e# ?/ V
6 k0 j; V: }/ [+ N4 N* }5 ^2 i: K# S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. b/ D' W8 U: D0 E
unsigned int count_copy = 0;
: E1 O! d$ N2 Q* X" t4 ?' F5 Y
) P2 x; @- I. W2 |9 D) `) R4 l! u
0 g6 A2 x& p- @' i7 ~5 r4 {
int main()
5 s$ A: x3 v& d% k" a4 u
{
& y% P8 M& H2 ], E
pRX_MSG_PROTOCOL pshreRAM = NULL;
; ^) x$ f1 R% T6 |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( F: z; e# W& H, M6 {( J: `: e
* ~9 U0 X4 L1 o4 R% o
while(1)
7 F+ N" A1 Z7 @8 j0 b6 G: U
{
8 L+ U9 N4 [8 J7 j5 p) j
read_MSG_buffer(pshreRAM);
7 h. A; J" p% F1 P) {
}
9 Q) G: R J4 {! k$ W/ r
}
' l( V% m8 F* p* e
: ~3 g* F" V$ S- q8 I9 r5 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 _* X" W6 w: f5 l
{
0 x: x2 k+ x% T z' Z- T
RX_MSG_PROTOCOL buf;
. i6 r) Z% t$ l4 \8 r
) ], Y! h2 n( H
buf.a = pshreRAM->a;
/ @3 l ~) n. \3 P- t
buf.b = pshreRAM->b;
0 F t4 h& \( ~4 i" d
buf.packet_cout = pshreRAM->packet_cout;
- X" T% X, g- B+ |
5 a. E4 ~& I; C# s1 F
if(buf.packet_cout != count_copy)
% E Y8 s: l: Q& @& ~: \( m, F
{
5 ]' ^" E+ T9 n9 w
printf("a is %d\n", buf.a);
0 g7 z# ^2 e, f$ A% ?
printf("b is %d\n", buf.b);
x: \* S& _( q9 {$ d' x
printf("count is %d\n", buf.packet_cout);
2 v$ ?; l% i+ f% l8 F$ |, `% M( i
count_copy = buf.packet_cout;
! ]% n% f& m: [3 _7 L
}
2 G1 w" d8 @5 c! V2 h/ e% E |& q
else
8 h, H' k* X' \2 C! k) {, o
{
6 }9 ~2 s& ` Q! e) K4 F
printf("No effective message!");
8 I+ O4 S. a9 E B" _( i
}
0 M$ v: a7 G6 z% K" |
}
& f4 S* i* O7 l X
3 U) k/ Y' w1 `- M# g* ]. O9 C
* w! ~ d, W8 ]/ D# h# t4 D7 W% q+ c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 c0 y* z$ V6 O
使用下面代码,对内存使用了mmap函数后:
% y: T5 Z4 S; h( s$ s# ?- a
#include <stdio.h>
4 W/ `8 m4 C" V- ]
#include <unistd.h>
9 S& L' g* Z9 o9 ]! N
#include <sys/mman.h>
( C( Y5 c* u- l/ |0 o7 ^
#include <sys/types.h>
3 c" k H7 H( u- C3 V
#include <fcntl.h>
' C/ O% M3 q6 u
. p% Q! c5 ~. @7 X4 E
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ _( I( N4 u. D) b/ Z
#define SHAER_RAM_SIZE (0x20000)
+ y/ E4 [* [5 i! H" o6 x8 S
0 [% X( C/ ~* y' E2 g1 \! Q+ x# d
typedef struct
8 y0 ^$ P9 W7 |7 }. ]- V$ D
{
4 h ^( R y8 g4 C; L
unsigned int a;
1 j1 G1 y7 d8 }, U( h- M% y
unsigned int b;
# B! [3 F$ p5 N ]0 U* ^
unsigned int packet_cout;
3 } m% c8 c; u2 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" N: G; ~! V3 [$ M Q/ R K
" C( u# g! g& H+ z3 x* r3 C# E
void read_MSG_buffer(int *baseaddr);
+ L$ z2 s4 |4 x
unsigned int count_copy = 0;
+ E- o( w2 f; G
3 a) v$ C9 M$ X" p$ H6 i
int main()
/ |0 Q {- o- T4 O
{
1 r# d0 K3 f- m, F
int fd;
& t% [- t$ Q" c, [
int *mem = NULL;
* [# A# ?; `: ]' S$ @
7 R7 K% w# V+ J; q& ]
if((fd = open("/dev/mem", O_RDWR)) <0)
" a0 k4 W$ T, ^$ \0 Y m8 Z
{
) C, c7 H# ?% \2 H( x# Q$ ~
perror("open error");
% k8 e9 ~/ V9 w1 s- \
return -1;
" [& D8 V) `9 m. I
}
/ T" @ d" y0 g9 H
8 k+ O# o5 c0 X# O& X6 c3 C+ K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% }, s/ v) u& ` `
8 ~2 l7 C% @' a7 b
while(1)
& D# k! f( a- x: R" Y- x; @
{
& |% E* g* S. A3 ]
read_MSG_buffer(mem);
$ @8 u+ ~* r" C
}
1 H q, Q6 L, p; V3 e4 s1 C
}
C$ R/ H; g+ |" @# o1 l: f
: H% W: N! I; d1 R6 B
void read_MSG_buffer(int *baseaddr)
! ?4 r' \6 X! Q' ]
{
, q1 q; w" e3 \, `. X! T
pRX_MSG_PROTOCOL pshreRAM = NULL;
! l3 S- [1 w( [4 Y( b
' M- S, ~. w2 c% U, ]2 j# [* L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ D6 ~# @& n- `+ C8 `
! E" H9 l2 ~: o# r9 f* c( ], y$ q
if(pshreRAM->packet_cout != count_copy)
0 q" ?# i/ D* ?" O
{
' ?- j- \6 Z8 y8 R
printf("a is %d\n", pshreRAM->a);
& y( D2 M# D1 g9 B( o
printf("b is %d\n", pshreRAM->b);
! n( F$ ^$ g N( Z
printf("count is %d\n", pshreRAM->packet_cout);
. Z* X J& e! t0 B% q8 ^$ p
count_copy = pshreRAM->packet_cout;
2 |9 g4 ^ a: c# U
}
t% S- H4 ^3 ~
else
- I! y; Z4 N7 M
{
# ?; i; O& i) {1 l5 X F4 K, |
printf("No effective message!\n");
# w! \' R. w w
}
4 G7 {/ H& F( y
}
$ p, Y! a& i! v" M3 B
" ^0 l- B9 D7 r+ s6 G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 S# n1 X) j/ \0 E; i8 z* r/ U
& q( o" c* |. |: }
: c3 z9 S J2 w# Z4 w" D5 F
C; L6 }2 C: n- l0 e/ y
' f& H- U$ V9 U k6 i5 }9 ~
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4