嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( h4 `5 K7 T- r8 T' A5 l8 v; F, w
( |& B3 ^7 b% [ f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 a; a8 a/ B' a- F9 N) Q+ ~/ ~
#include <unistd.h>
/ l# c. {) a( o) s- A
#include <sys/mman.h>
0 P& E7 _9 H) Z0 u
#include <sys/types.h>
5 ?- ^ f1 k) g* ]4 m2 p
#include <fcntl.h>
+ S0 h7 M4 c* _8 `- ]$ f( R
, T, x) d7 Z/ p6 t3 z$ G! k
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ H* {& A2 e$ `5 z8 X' }4 {2 V
- K' ~2 @" s6 J* O
typedef struct
' `' v( n+ K3 z+ F! J, H
{
1 w) \: T) x [& c) j& G. C
unsigned int a;
+ }+ F; i; p1 J0 d* S
unsigned int b;
- Y: R' b. ~0 Z& j4 V1 C
unsigned int packet_cout;
; ]3 e9 J* P9 P! _# H9 f3 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 r, @% ?, g* ~; C
" ?4 ^* s/ M5 [" r2 u) _" e- d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 F) U" r* h7 y z
unsigned int count_copy = 0;
$ M5 J( T) Q4 c9 |/ Z' H5 D3 y0 c) a
$ G0 i+ @ k4 L0 u! g- ]+ L, l T5 ?
A6 {6 f+ K& C7 f" Y V2 {5 b
int main()
4 A3 w2 ^' [7 } D1 w
{
* u3 ~8 G+ D$ r- ?7 [+ t
pRX_MSG_PROTOCOL pshreRAM = NULL;
. O4 y7 f' }4 ^' `" s2 p( p# u, l$ p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
H2 ?. N3 L$ o+ O- R+ @
# r: |( L0 f. c
while(1)
# {. E8 v5 ?+ j
{
. k7 r" [( |5 o
read_MSG_buffer(pshreRAM);
) [& k4 r7 Q# _' m6 p3 Y8 d( i
}
: M* }7 n- ~: R" i$ ]
}
7 W) ?2 N f" M" ?, M1 y" _
0 c2 O# H/ |2 Y6 X* g) L+ L7 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( T: n+ E8 }* D* l: `
{
6 H( D7 D* t/ p( g4 b1 l% D4 b( w
RX_MSG_PROTOCOL buf;
1 M2 r2 j' B2 ]% I' @3 d5 {3 H
" q9 y0 A3 H2 o( o
buf.a = pshreRAM->a;
7 P& {) }$ l0 B6 |. i5 j# d
buf.b = pshreRAM->b;
! B) _- Z" V! N/ {5 ?
buf.packet_cout = pshreRAM->packet_cout;
( U% T2 V; }1 i7 G; J
, c3 v/ ?' q( ~( s
if(buf.packet_cout != count_copy)
' l: c3 l% m: T' W: `# O9 T
{
8 b8 M ^0 p9 A
printf("a is %d\n", buf.a);
/ W' D9 ~/ I0 |# B# R3 t v
printf("b is %d\n", buf.b);
4 v7 X1 O7 M: @. O( B3 S
printf("count is %d\n", buf.packet_cout);
4 E p$ p! M8 g
count_copy = buf.packet_cout;
: _" H! N5 ?7 a8 M* M9 m1 q M" w
}
2 p5 [& g5 @& S9 c5 c& J" W
else
/ c( T7 t& d3 n8 e' q( i
{
1 r! l( Y4 `( j. B; A) T1 i
printf("No effective message!");
) [* Z" |" i! j
}
* ~ Z) g, V. U' F7 L" u
}
: ~# i( G) X u
" Q; y% O# {, D" S
8 M0 x* j/ W" K" h* x* S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 Y& \# ?2 m* t7 }. B' P) q
使用下面代码,对内存使用了mmap函数后:
# r9 J/ d5 a! u/ z
#include <stdio.h>
! z4 w: H: ~5 m- R6 H3 p
#include <unistd.h>
P4 q5 b1 g+ h3 e4 S
#include <sys/mman.h>
0 D! P5 ]9 y y5 u1 U
#include <sys/types.h>
) \' [+ \( g( u9 O
#include <fcntl.h>
5 F; W6 s2 [2 E1 F: A% X1 e
( m1 q, J" s3 i, q% j" Y" l
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 T5 x! C1 R9 q. {" U9 [
#define SHAER_RAM_SIZE (0x20000)
( d6 p' E) c1 S# j' m9 z4 d
5 g- d# `8 }5 C' ]) p
typedef struct
+ @: y* S; b! x5 W
{
/ B. _; a, m$ j) p6 Z
unsigned int a;
+ O+ }; T3 x9 p& V# ^. z6 J7 P
unsigned int b;
- q; `. f' S2 O+ ]1 o! M7 Y% B& f
unsigned int packet_cout;
" w1 v+ L1 m. F6 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* b& f5 ?4 ~+ |3 j- q
' x' E+ c% D/ d6 I
void read_MSG_buffer(int *baseaddr);
& p& D0 v8 n. P$ e3 h2 ~/ U2 ]
unsigned int count_copy = 0;
0 ?( P" g% M z" |2 R8 @7 {# v8 V
3 U, j. j: Z' q7 h. g: u
int main()
! R5 w- z7 b' m; S7 D7 D- W' V/ s
{
# U" m! S! |+ u$ ~, N+ X: I8 A) O2 T7 g
int fd;
5 e$ w& }/ e i6 u: i" ~
int *mem = NULL;
+ k) r! q! h; i9 a
5 E, ]# ~9 `, s4 n* ~3 ?( V
if((fd = open("/dev/mem", O_RDWR)) <0)
7 u5 C- g/ E2 L1 D [
{
6 z+ F/ G; Y( u: b; }( g
perror("open error");
& C" ]& O5 b7 W) |$ j
return -1;
9 x" q2 e2 Z1 q! T
}
5 o5 i" U! S# H# X! i
; A2 l0 C1 x9 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ f8 C+ s& P' X" ^9 V+ A3 I
4 ]# @. w0 h7 I6 U* f @
while(1)
; P) y8 i' y: j5 J
{
. r# F/ Y7 j9 f4 q" \! p# g. P
read_MSG_buffer(mem);
# h" L" N4 g/ ]' u
}
{( h/ O3 A. I. b$ y7 y
}
3 t! H* T3 `& Q. S2 M
" e- L, N7 O: u) N
void read_MSG_buffer(int *baseaddr)
2 Z7 I' K0 o* h: U0 @5 ^4 G" ]$ ]- w
{
' l% }! Z; _* l1 w) Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 |7 W# d6 k, R- ?8 r H
3 M2 ^9 b6 i9 O6 V; B) N+ @# r+ t& F: d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. y" V, u! U0 h! r8 Z
6 @0 d7 B- Z+ d
if(pshreRAM->packet_cout != count_copy)
v t: B, j- p5 f' z/ H
{
E9 Q$ T0 F6 I) X
printf("a is %d\n", pshreRAM->a);
2 z. W4 o5 v4 H4 o; o" X
printf("b is %d\n", pshreRAM->b);
3 i+ x# X: g* @1 K+ e
printf("count is %d\n", pshreRAM->packet_cout);
; m5 h3 M5 d+ H, J/ c4 I: Y) h
count_copy = pshreRAM->packet_cout;
/ X( Y* a2 g& A5 @! v- d1 Z! q
}
: S, ] T6 o/ j+ e
else
$ c/ G+ _6 F2 X8 u- e' U
{
' `* z. F, S% }, o3 [; J3 l# w: z
printf("No effective message!\n");
( @9 z; \" u% k+ `' }: U' h
}
" X$ k( E4 h- C
}
5 y" R- G2 p5 j. t! ^! L
R2 y g; w' b: F- e1 g% q, l6 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& M! Z/ \/ Z4 T, J$ O7 R$ Y
, `" Q8 N( g' o! b+ {9 k: ~' J
+ t+ n8 k/ y! l2 V* L2 @
* L. v/ a5 N, h" I1 Z4 L* _7 h+ K
% i9 q7 U& O8 X4 l4 g% h* Q- l
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4