嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& H( B7 I! l# u$ ?6 n9 x
/ M( {0 y0 W3 k9 F5 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]& ^0 T; e+ P0 d
#include <unistd.h>
) g+ J/ _$ P+ O
#include <sys/mman.h>
" j! i2 X- q8 |9 a
#include <sys/types.h>
) B7 E, h5 J7 w
#include <fcntl.h>
7 T2 J/ V$ R) f/ Y4 b! O1 C# Z/ u
6 {2 R/ U9 \, t
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 A" Y+ y* _- J
, w: ]! W9 n7 B. e/ [, w
typedef struct
1 L" H: k7 Z* x' r& y
{
; }7 K$ @5 I. S+ B- R8 M
unsigned int a;
; i' d* _1 p# q5 b' O6 D: ]
unsigned int b;
5 P. f" Z1 K: t1 b' |
unsigned int packet_cout;
+ _- n* t6 n2 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 W4 ~; ?6 B% l5 R
4 k9 F$ f( R" ^8 M. ~& C9 b" m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- e: e9 K# q1 @" @/ U' M, V9 r
unsigned int count_copy = 0;
7 f( u! A) |. f5 `
: y( }( J) F; a7 M1 l+ c; a7 R
3 U1 i3 e7 |! I$ z" n+ Z1 [
int main()
+ S6 d* ^) W( ~5 v+ ^3 U0 f6 T
{
( n* l. `/ r j! i5 K; }
pRX_MSG_PROTOCOL pshreRAM = NULL;
- B( B* E4 T- H; C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. m! k4 K3 ^% P8 l/ L
7 `0 a1 z) e( L0 `. c
while(1)
: O" H! D4 |1 ^, w
{
3 `7 z$ x2 y7 B& O: |
read_MSG_buffer(pshreRAM);
- m: n( M3 g6 [9 c+ i% q
}
+ q3 I \$ s+ I5 ]# j! l9 r
}
$ j0 w; e. u5 ~9 R2 ]
\* k4 Q S9 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( [0 L3 M G" Y( x+ ?/ F; f& ~4 ]
{
) E3 U0 f; s& n1 `6 n! M( Q
RX_MSG_PROTOCOL buf;
9 ^' H X2 j* _) r) ?5 ?. R
- J1 d( `5 m2 ^9 A7 L$ \6 C
buf.a = pshreRAM->a;
) h3 B. b" L3 q* J" m
buf.b = pshreRAM->b;
3 e& y& q, F- N: i# J) `/ M$ ~: \
buf.packet_cout = pshreRAM->packet_cout;
) T- z5 i% t8 r1 I( _4 K$ A) s
+ g5 F5 p$ b1 _! A" A$ i
if(buf.packet_cout != count_copy)
3 G2 ?5 {4 p5 V( S- ]
{
1 ` _- {. H' R' T
printf("a is %d\n", buf.a);
4 F [' }8 g- M6 v& _ c5 K
printf("b is %d\n", buf.b);
0 |8 v' O L9 V
printf("count is %d\n", buf.packet_cout);
. T" }6 b. \8 Y3 U
count_copy = buf.packet_cout;
! \# H8 D* A Z! D" U. o
}
- f5 l8 b# Z4 w1 J; a$ x% O( T
else
4 D5 J3 Q! e1 U5 V9 }; J
{
/ \6 {- U0 O+ b- o2 e3 ?
printf("No effective message!");
- V4 x8 l: \4 z1 R8 q7 ~1 k
}
; @6 X8 j. l" v) w
}
" B. N4 m% a) I
U9 L: B5 R6 T" F% ~; n2 s& t1 j
/ A( |, S/ j9 w) z! ]" [, T- S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 Z0 S6 h( v' t. [ c) \
使用下面代码,对内存使用了mmap函数后:
/ M& c# v0 G4 k! Z4 f- A0 P8 e
#include <stdio.h>
6 r3 N5 j6 g8 }) c1 W) G
#include <unistd.h>
9 @2 U$ C2 n9 Q/ z5 p+ E
#include <sys/mman.h>
' r! l' M( S9 r/ N: ]
#include <sys/types.h>
/ D H3 g* `' G3 h3 b
#include <fcntl.h>
0 B' L0 F% @; H3 M' [
" Y$ ~" u3 Y& K
#define SHAER_RAM_BASE_ADDR (0x80000000)
, F( O% c4 T# b, C2 l5 k9 F
#define SHAER_RAM_SIZE (0x20000)
7 E9 F% Q1 B* w0 W8 P
. T W9 l/ {8 I( f; |6 g" n
typedef struct
, G1 a) N2 P: y, w) g
{
: l3 M8 n0 u Q- n. ?- u! [
unsigned int a;
3 g, J% o5 F5 v0 H$ ]
unsigned int b;
& f9 a3 n5 \, e$ U
unsigned int packet_cout;
7 C0 @/ S' j W0 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 I- J4 {7 l- S7 N
( E' I! d8 a" O0 Q/ D
void read_MSG_buffer(int *baseaddr);
/ {# r/ L' w5 v0 P- c
unsigned int count_copy = 0;
* Y7 l3 C- _6 |$ E/ {6 \" i8 x
7 G: K1 R3 _6 ?) _
int main()
& ^! j7 J! q1 V" A
{
$ Q- w- V4 m- g' v: g
int fd;
& I" L5 u! K2 e# f
int *mem = NULL;
1 w, ~( _7 P+ o, o
8 A; q9 ~% k: d
if((fd = open("/dev/mem", O_RDWR)) <0)
- N/ v$ g9 o" V/ _. N5 t
{
4 s: y$ m# n' m
perror("open error");
- Z( u: a: g* e( H( E2 ]" J
return -1;
+ N* V$ {: A8 K. |- O! |
}
: {9 u( E& y' F. |
* u) o. e( R, J E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: x8 o! J9 D$ X. d! ?
. Q" N' g5 H' U* c9 w y
while(1)
! N4 t# {. f2 @, d
{
- U, \/ T* b2 I' V0 v
read_MSG_buffer(mem);
' m8 ^* [2 g" e; v3 O
}
# n; L3 ^! G% L; _# p; ^$ B. q
}
/ S/ w* Z" W2 d# K, ?) S4 B
! ^" X4 M6 N- r, H$ ^
void read_MSG_buffer(int *baseaddr)
7 K" D3 ^6 }0 D
{
" ?9 M4 d2 E. t2 u9 |
pRX_MSG_PROTOCOL pshreRAM = NULL;
^8 l0 h) l$ |
. U0 T. |8 C- Q9 y* K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 t# Y- `" U) ]7 g
+ D" r( m$ }5 n, n/ h
if(pshreRAM->packet_cout != count_copy)
+ P* U" l) t! ?
{
( I2 F* @- c+ A+ B
printf("a is %d\n", pshreRAM->a);
$ l/ h8 \% B8 ?( L/ p& J+ c
printf("b is %d\n", pshreRAM->b);
' e8 g; e: ?/ Z& }, ?
printf("count is %d\n", pshreRAM->packet_cout);
1 L- q2 O7 I, c2 k% [! m
count_copy = pshreRAM->packet_cout;
8 Q! X# }( P6 P* s
}
+ D# f. z! e7 Q
else
. }0 O# P1 H4 T
{
( Y+ g% K. }4 o
printf("No effective message!\n");
8 a# v( {! {9 S4 ?5 X$ {$ x
}
# K9 n- {* m; A2 s! [- S t- ]9 T
}
2 j; S$ ?# S8 s7 @- ?$ ?& {
/ X6 W6 V& c1 g5 _- g5 `! a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ H3 V& w+ s! Z% V' C, \" j% t
% c+ m3 k, j* d# [
c! k R1 ^( k
2 L0 O4 H+ K& a& c8 y6 ^4 ]; c
" q/ ]0 A' s8 h! f
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4