嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s8 M% Q! x" W2 H4 c* J ]% K
4 g; F. f a4 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 _8 m/ c; T' _9 g4 `0 k
#include <unistd.h>
) ?5 V2 f! D( Q
#include <sys/mman.h>
$ v+ T* e/ C7 f+ V9 z/ h
#include <sys/types.h>
# C, @3 Y( O% ^9 B6 W+ @
#include <fcntl.h>
$ ^* Y( u5 M0 X; O
! I7 k+ M3 [" G; V% X
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ ?: a4 [3 i1 l0 @8 r* U4 B
. @4 ]5 N ]$ A
typedef struct
( s; _" J! Q$ c9 t2 U4 H5 |
{
: f" @# `, A0 \3 I. G
unsigned int a;
0 ^- s. V8 ]: H2 K2 }0 q
unsigned int b;
* Q/ W: _7 ]' V! i
unsigned int packet_cout;
( i* R2 { u: a& b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; i+ b' t( ^4 _ j
! P! i' d. ]4 ~2 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" z5 ]5 R8 C" _0 I+ }5 |
unsigned int count_copy = 0;
; ?+ }2 ^( ^3 P( S% ^7 l# t8 c
! m; L& E$ d# r2 h6 ~
4 t0 ]2 v/ w: ^; e- E3 Z
int main()
& r0 r: L7 X* z, r+ M9 W: a6 P9 e; X9 s
{
6 p$ @3 x* ]$ }. f$ ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
# \0 R8 E+ ?* V0 z, `$ N/ x% o% B2 ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
J5 ?8 c: |5 \! e& a
4 P6 e; g4 A6 s# E
while(1)
; V/ z) J; g) |; d. @' I
{
; p( i. @! i9 X
read_MSG_buffer(pshreRAM);
4 B( X* z4 x# s+ f, {
}
: i% w9 U/ R) B( x) F& H: G$ r$ R( z
}
$ v6 c7 p0 S1 e; |8 {
, y! t. B- |' s8 @9 S; n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ F) M8 r- y+ p; Q t( G$ C, ^
{
, \" L" _+ L6 U7 G6 V# Z7 V m3 q
RX_MSG_PROTOCOL buf;
. o2 M7 n+ y8 o+ T: h
1 R, M; j* t5 C! T) @( I
buf.a = pshreRAM->a;
) F8 O8 h F- w- n" a0 J
buf.b = pshreRAM->b;
; N9 B1 ]1 C' x \5 |; `! A
buf.packet_cout = pshreRAM->packet_cout;
' \* ]4 E: E. _9 P X
2 D+ k7 J# h" b& H
if(buf.packet_cout != count_copy)
+ M% N: Y- `: W
{
$ h5 Z: ^) v7 u @ L& s( F+ z6 w8 g: P
printf("a is %d\n", buf.a);
. {5 C- [+ ^% F
printf("b is %d\n", buf.b);
- W: g( r% Z. S/ i; a6 X% b3 W
printf("count is %d\n", buf.packet_cout);
F. V s, l1 {. P% A7 Q
count_copy = buf.packet_cout;
8 |! z9 ]+ d! K( V3 k
}
3 @) d( J' E, E! b* @* @
else
# _$ H" E6 _$ ^
{
/ r8 ?4 M; Y! q8 m2 r- ?( p
printf("No effective message!");
6 L" W" z' R( I( Z' z& c7 W) x
}
6 e4 Z* K1 s7 Q: K, r
}
1 Y' R7 L- h, G' O
1 y7 Q# T) s+ P4 W% [' U" w
9 }4 S; U: } d# q7 k% q( h7 e7 f$ x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 K' ^5 V( g+ \" f6 F
使用下面代码,对内存使用了mmap函数后:
, ~2 J0 V. a4 F# M2 n. ^& R
#include <stdio.h>
$ \( n- M6 _2 F" W: [
#include <unistd.h>
6 c6 r; ^3 Q% f7 a+ h
#include <sys/mman.h>
" ^% a1 Y- C# U4 e$ [2 \3 w
#include <sys/types.h>
9 v1 r% ?2 R# O. T# m
#include <fcntl.h>
# [; ~) A/ n; Z3 E$ m3 R
; A W$ R6 W# x( y% S* P' u
#define SHAER_RAM_BASE_ADDR (0x80000000)
% u1 m& y8 y" b9 X5 j
#define SHAER_RAM_SIZE (0x20000)
* r3 K' G/ y2 ~! L! I' [
" n& g ^( {7 ~: M) I# V
typedef struct
, [ @% v" r c6 N1 [6 Z- M
{
, x( U( C7 R; z* @* D
unsigned int a;
, E3 l3 k# w1 X' C3 N, l0 W
unsigned int b;
) L p9 V. j5 X
unsigned int packet_cout;
( b O/ P) S+ J% E' P7 J. C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 E" r/ S& I% v2 J
6 m9 }, B: f: |3 W3 o
void read_MSG_buffer(int *baseaddr);
* D) Q0 W: s8 t( M, j! L
unsigned int count_copy = 0;
R. ^7 A8 n6 }4 k
+ D& ~- u3 N" F% `
int main()
" U0 M4 y( h% x2 F
{
* O' k: D8 H9 k: \( t* f6 \8 E4 x
int fd;
9 ^5 o+ B3 C: J
int *mem = NULL;
: s8 @6 q$ U" v' d- z6 s6 D
" c1 o# R% T+ u. b( q
if((fd = open("/dev/mem", O_RDWR)) <0)
# E. }0 s/ z, r- ~5 t" [0 v5 N- f
{
6 o: l& u1 C: }
perror("open error");
( G: s, n+ \; i4 C( ]! r* E
return -1;
8 h' O' q6 ], l: j/ U4 K
}
# Q; _, W" l7 B# a
4 X9 }) L4 [+ z* O: g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ I, Y( `3 ~2 j( J: q: c
5 K* C6 h4 n' m, O x' D( e0 l
while(1)
/ ^# V) z1 l3 b$ v
{
$ m; P. L: x0 N8 B+ Z
read_MSG_buffer(mem);
2 C" f$ s) t2 L0 n. y- u! x
}
5 d2 o) k* G+ f7 P2 G1 M% P
}
/ X: ]* @6 u/ T4 G; j7 s! a
& k/ n" R: ^) o1 T
void read_MSG_buffer(int *baseaddr)
/ V" i. @3 q2 w- |6 a0 p& u: r
{
0 r% I! Q; h% r
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 [! @5 D0 w9 ]1 ^8 \$ y' _
( c! |0 }4 d3 n' O9 i- `# B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" M% y) b8 c1 {' w
1 I# _: d* H0 g
if(pshreRAM->packet_cout != count_copy)
+ d9 f1 N- P1 `8 a2 _
{
9 c+ v7 \* g5 y- q1 b/ r
printf("a is %d\n", pshreRAM->a);
' d* ~( T, [/ g5 I; i
printf("b is %d\n", pshreRAM->b);
- t) E4 I% [' U' E" H0 C; v
printf("count is %d\n", pshreRAM->packet_cout);
; ]; N6 }. T9 I) k
count_copy = pshreRAM->packet_cout;
/ {2 }% O9 M# {0 f
}
& B& I1 e7 x# ]" d' d6 L; c# W
else
2 e: m: y8 q- v3 s) w
{
& G. F! [! D$ ], \6 v2 T7 V8 m8 H
printf("No effective message!\n");
x7 h0 ?. m- a7 P" ]( g
}
' X0 e7 g. d& g0 c* b. ?
}
: l# I0 h- R4 C
& `; Z% u8 F. J/ d! y) L0 V: f8 t$ E0 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ J& B' z, X5 ?/ z
3 J( P- l b+ t" x2 d
* ^0 _- m# P: A4 t: H
+ Z9 q- C I6 M( |: A$ w$ p, s1 }
6 w" D* x" x/ }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4