嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 ], H6 [# i+ w- m5 C) q
+ L6 r! O+ [3 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: o4 g1 N! [8 m* ^3 V
#include <unistd.h>
! x- T4 J$ O: M3 A$ A. S
#include <sys/mman.h>
- |% F( O/ b3 }
#include <sys/types.h>
/ {/ O$ Y) O h2 }9 a, B4 y: ] M
#include <fcntl.h>
: r7 q% x/ p; r/ P; e, |" I+ Y
3 @6 x: z* ]! I- y) s# `+ D
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ^7 s* L5 ?: t! S
( b6 s# m* U+ P* _ T4 s6 s1 V
typedef struct
9 a' j& |4 A* i" X# O
{
/ w: I- N+ W2 Z0 ]& g" i1 _
unsigned int a;
) Q' Z6 E+ g6 @$ v, T$ k
unsigned int b;
5 v) ~- J1 d1 F, ?. z" x+ e
unsigned int packet_cout;
! T& K7 k! M9 F7 p' O( d2 _# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, P; P! \' x& v! |7 b
/ N* j- w' {$ Y4 G+ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 b/ }( v( j1 {( e* E
unsigned int count_copy = 0;
+ Z( ?1 ~4 w/ f3 i# n8 c
$ H$ c& U* E9 p3 | H8 Y3 O
* |9 H7 ^( R c6 ~4 _( b0 ^7 Y0 v
int main()
* t v! {$ p, M0 U6 F# t6 y
{
' X) ~# {! D0 l, J+ A
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ Y, S! R( w7 E; p0 B2 [. f s( m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ x+ s2 ^+ b* a
$ o( M0 p6 s" z m$ D9 U/ `( m
while(1)
* N6 Y$ z7 `, m4 J6 H6 I
{
; o+ T, j. I4 m V" [
read_MSG_buffer(pshreRAM);
+ a F* g) g/ S% n! @) w
}
, j8 K+ W; u1 a/ _" }0 t9 z
}
4 c! Z8 q2 U# m# o+ X$ r2 W
9 X: g$ j8 C V* \$ _: c/ @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, C9 O, |. Y: Y4 N4 B
{
; W% r( {; ?3 ]* h) [
RX_MSG_PROTOCOL buf;
$ k' O% n. y/ l0 j% [- G7 ~
' N. v+ v8 Q3 k( w( u2 Q
buf.a = pshreRAM->a;
5 {% f/ f2 M: f8 H( G6 i" U
buf.b = pshreRAM->b;
" }' ]9 n& { j) _6 U
buf.packet_cout = pshreRAM->packet_cout;
8 S- `) y6 X5 U4 R H
( r7 N' ~) t' ~: M l; R2 `
if(buf.packet_cout != count_copy)
2 R, o8 P: B5 H: C- ^* t; P: P u
{
/ w) N; S* {# q1 V/ h
printf("a is %d\n", buf.a);
7 n9 ^8 X6 h' w) y) i9 a
printf("b is %d\n", buf.b);
9 M9 v2 F/ Y$ \1 Q: |& i9 q
printf("count is %d\n", buf.packet_cout);
5 N* M& }& l* B3 G5 W7 F. S5 D4 N
count_copy = buf.packet_cout;
+ X. l% P2 M- k- K- p6 A- } M
}
7 [4 o* o) d7 x1 x
else
- x9 O. h" N+ s4 d4 R0 W( T9 j B
{
9 R1 j1 Q; ~; A @6 A
printf("No effective message!");
& q: ] [, A9 Y4 o
}
8 p6 o1 b5 v, k
}
' D) I; w1 C* N3 f, f
0 b c+ v% A; \. J2 w7 c* W: b
8 l8 ^3 ?/ w& e4 \$ ]5 z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 v0 ]! B' [( C) s- N" @9 o' j
使用下面代码,对内存使用了mmap函数后:
k8 I( {) m. K
#include <stdio.h>
, k6 z/ ]. |; L
#include <unistd.h>
. j9 h- o6 h7 O" J
#include <sys/mman.h>
, \- o1 M# j- Y7 y' z* R
#include <sys/types.h>
% \: i* Y* A' q* h( Q
#include <fcntl.h>
0 _+ J: Q( }" b5 [3 V$ E1 Q
1 N) B' R }0 g! o T
#define SHAER_RAM_BASE_ADDR (0x80000000)
N9 Q) ]) V. R& s/ v3 F" L! K& I4 Z
#define SHAER_RAM_SIZE (0x20000)
3 n2 k. h$ i0 p6 K, P/ ]
$ U6 c1 Z, E( W7 \
typedef struct
# R; c5 F( v) j5 u. W
{
. P; ~- l% g: n
unsigned int a;
/ {# L# g! s) b$ @- Y
unsigned int b;
) ^4 J0 E; E, g' n" n7 i" p( Z _/ U
unsigned int packet_cout;
/ D$ D) X( F0 `: p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- @9 S) g! k# A8 S5 B
3 k; S0 M+ t. w" r( Z5 o' ^+ z
void read_MSG_buffer(int *baseaddr);
- J, v6 I. Q* r+ X4 F: L
unsigned int count_copy = 0;
X; I5 ^3 v; O' S
( D+ F9 s! g- d1 u& g% _
int main()
S; f7 c5 V% F2 X; ]6 m& R6 F" z
{
+ Y2 M3 s9 r% G, C, [- f" b2 W
int fd;
, T2 H3 `9 Y, D J* U
int *mem = NULL;
8 N ] r+ @9 |* @: x( W+ W
~5 O6 {4 q+ |* {" S
if((fd = open("/dev/mem", O_RDWR)) <0)
% ^/ x4 `7 ^) d7 |! C
{
: i* N1 [# i" h4 v5 B0 @
perror("open error");
1 T& [* m) _* P1 K# ~, k* w2 u
return -1;
* M3 X6 P% d; [
}
7 F6 Q/ g$ S7 j( V* p6 O
" O' [5 L5 f+ Q5 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( A% P& S. ]$ n6 m4 f4 {) S" _6 A
2 Q/ o$ u' M" F8 L
while(1)
; o/ V& E" `5 g( L' Q/ A, r
{
7 y3 s2 E* V/ e3 o4 Q P3 Y4 V
read_MSG_buffer(mem);
4 P/ e8 U6 M# k' g- N* b6 J
}
2 p) M5 |5 I7 U! o
}
- C$ d0 u- A2 U# o& g, W& p. p
6 v. l: D* ~$ l$ y6 E, p
void read_MSG_buffer(int *baseaddr)
& ]* x: q8 K: z2 K
{
: x! K, q: Y% G" i$ M5 M
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 h, W6 d0 B) B! P& Z
4 [ f+ O) d4 G- q* J" v U+ V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ~3 Q- {6 p! l" D9 A% |( K {, C$ Y
% U, v' w8 B* ^) _6 @, S
if(pshreRAM->packet_cout != count_copy)
0 M' V3 _ p/ s% \0 v# _- }! U z
{
7 t! U/ q" W6 m, ]" c4 M
printf("a is %d\n", pshreRAM->a);
* s" w- W8 \! R) _5 d* X* o, U: O% O
printf("b is %d\n", pshreRAM->b);
/ S" S8 d. f: `- k
printf("count is %d\n", pshreRAM->packet_cout);
7 K; `2 t+ z" p1 ^$ z- Y
count_copy = pshreRAM->packet_cout;
* G# {6 G! j' o2 R* e/ ~1 \* m1 ?* d
}
" s, g, n3 `5 I0 [3 d
else
& l' n; H! f" R5 z& w
{
" [6 W# J1 x4 h
printf("No effective message!\n");
" `" t. G2 }9 `- b8 Z( g: [* J
}
" |" f6 S, N3 w
}
9 H0 n9 U Q1 x& f) `- [1 ~$ v
; H, ]# j( G; W* ~9 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( `7 n% Z' w% F5 e& P
0 c9 z' ?" Q: }% T( n% L, J
& o# m( k+ C4 ^8 K1 o0 @# P5 N& O
8 w t4 |% k7 I8 _9 z
s, W" z- g% x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4