嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! o7 }! b# a: C
9 C8 F5 H- V8 B( r' @ C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; u- T9 W! F/ ]
#include <unistd.h>
% P$ G3 b+ m/ Y- q0 k0 A5 B
#include <sys/mman.h>
# w; m) h1 L. a/ w' {
#include <sys/types.h>
5 H7 a5 x1 v$ z8 S* }9 n
#include <fcntl.h>
; v" y+ Z8 |% D
( T# E F7 [( p' D
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ k A$ n6 w, w5 |' F
% |2 Q% `) N3 S r
typedef struct
) g; J! S$ h0 j" t# V
{
* p" n& |- G4 o; ]* E' ^& m
unsigned int a;
3 j( e; }; B4 q: u: _6 Q/ A
unsigned int b;
( G5 I6 w; I( A) o- X: f. U, v
unsigned int packet_cout;
3 k6 ~3 t1 |! Y: J) c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
I" W j- F' R" Q' T3 B
) I% o0 c! H) s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' d W- N b, A1 j0 `; x9 n" C% Q
unsigned int count_copy = 0;
+ ~3 z6 _8 `- V" G
" g& w$ G+ {" E! v2 e5 |/ {- m( ?/ n) q
8 o' |8 u6 z) e5 M
int main()
" b; A6 U) ^1 g- l/ C1 L6 \
{
* g" k4 h& v) `8 i0 b0 u |, O
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 `( L# z9 m/ f0 y1 G
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' w+ Y6 I ]% X# v( L6 B; n
4 P/ v2 u! i' V9 Z. r4 F0 E8 g4 ^8 z
while(1)
+ S! l6 G5 [& ~* U0 Q
{
8 f6 }: | F1 F u2 U
read_MSG_buffer(pshreRAM);
4 @9 |( ?% j* w5 M- U. {
}
4 X- j% ^7 |1 R% Q# h0 f. `
}
* H/ o V* q' s* X1 W2 K5 K& X
$ [9 a$ T1 z! J0 l( X1 g, {$ u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ E i7 G, ~8 ~( R
{
1 Q. {# O6 `) f/ ~ P8 n
RX_MSG_PROTOCOL buf;
* C! q2 q: G6 x, M2 |* f
( m: X- q; ~& e* D" p
buf.a = pshreRAM->a;
; R u, N z8 R$ U6 m
buf.b = pshreRAM->b;
* r/ Q- _0 ]; `" y" k
buf.packet_cout = pshreRAM->packet_cout;
* I* ~7 ]! \7 G) @+ y6 L
. H5 o5 D3 Z* O5 C3 u( Z% ?; g; h
if(buf.packet_cout != count_copy)
5 X# u( F: w' ~
{
& G5 k/ u4 M; e
printf("a is %d\n", buf.a);
. _( g. h W, F M1 [) p: k! U& v
printf("b is %d\n", buf.b);
$ p9 M! v5 t9 F% D/ a
printf("count is %d\n", buf.packet_cout);
/ D9 y( B( E' X0 e1 B( S6 _
count_copy = buf.packet_cout;
8 w6 ^) j$ u% S g% R! e% e& Q8 o& W5 k* n
}
. l' M) F A! f3 f' s$ r( k# d k
else
. E; W* W1 }7 E$ |- v: N3 D
{
# j ]' ~0 N* g' d
printf("No effective message!");
! A1 d7 i1 [; ^- d
}
8 g! y6 @6 z k& D3 ?$ {' e F3 x
}
2 r2 x! C1 E7 B" N9 s) N I7 S
- L4 c7 L- E+ J
0 A( R2 ^1 k6 O% U: V0 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 }/ ^& S3 d7 W3 K, `; y `
使用下面代码,对内存使用了mmap函数后:
& X* w5 x+ O: p% R2 c/ i
#include <stdio.h>
3 T, Z! ~8 T. \9 O! F% ^& O
#include <unistd.h>
& I3 W" P( {0 z6 f- m3 K
#include <sys/mman.h>
! y Z- S' f% y( Y2 s
#include <sys/types.h>
1 J. L) [( A! _9 R
#include <fcntl.h>
0 V0 q' [" N; l" U) E( }& h
9 j4 b% y% S3 p' S$ F. I
#define SHAER_RAM_BASE_ADDR (0x80000000)
) P6 M$ r y# q6 y% W' L
#define SHAER_RAM_SIZE (0x20000)
5 }8 U+ V: l0 Y, C0 ~0 @
0 L8 l3 d, N% L6 J4 }+ V
typedef struct
% H) E8 j: ~, Z. S
{
& G+ o) N/ e; d* O3 D5 x
unsigned int a;
" t1 A7 w- A+ n! h5 s" d
unsigned int b;
. J% n$ F+ I0 q7 B9 P9 i! J
unsigned int packet_cout;
5 @' i6 v& D1 }; m& Q4 J4 o8 a" g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: R% u7 H/ G) _+ O( U% S
* _2 X# V. R7 j g6 K
void read_MSG_buffer(int *baseaddr);
6 g7 H# |7 I3 _# `
unsigned int count_copy = 0;
- U$ @; p& u" k u
* j6 g* {% j1 y7 P$ @7 m* d
int main()
9 N" b3 [! R0 H- a( ?. U; w
{
2 c+ t" z# S. g+ @0 q
int fd;
. Z* p/ g6 M2 N1 C. k: Q* N5 F
int *mem = NULL;
& s2 A% O. e. A( f' K
2 _* |- e6 a, M" ]" F! Y
if((fd = open("/dev/mem", O_RDWR)) <0)
0 o% i* T! S2 n, D! ~
{
+ J% u) n9 o& G& S1 u- j% W
perror("open error");
' e. K& j% z z% T* y* u8 \
return -1;
8 } `4 z: I' {5 T
}
& o7 h$ h3 d. c* B/ @) ], F1 }
1 t! u( r2 `8 e! Y" i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 s' e6 ~2 h1 i& N5 c8 n# Z/ s
, k8 e: G9 ~1 c5 u1 L9 ~8 ]
while(1)
: A% o+ V3 ^: i/ I7 l
{
, u9 f6 {! p9 {- K' g
read_MSG_buffer(mem);
' L7 e! {6 @3 q- Z' v
}
' }6 |9 q0 r* \$ g5 C% [+ L8 ]
}
. u. K0 d' i+ o% {
) s$ r% W$ v+ d9 [
void read_MSG_buffer(int *baseaddr)
. p1 ^, b; S0 z+ U9 w; |* p+ ]
{
0 h; f' N, ~2 W( D) x
pRX_MSG_PROTOCOL pshreRAM = NULL;
' d% y( E% u: t' U0 ], [3 i
$ M3 F8 V" Y& J+ `/ E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( w! r7 Y- L( i
( X9 b/ R8 r7 f# [3 w2 x
if(pshreRAM->packet_cout != count_copy)
; n+ A, M& j% h" q/ w) B
{
9 R9 j1 K6 H9 u ^5 k: d
printf("a is %d\n", pshreRAM->a);
6 w, c) {2 r6 M' T% i! |1 v
printf("b is %d\n", pshreRAM->b);
' |. M9 D5 T! K" p: P: d1 C* S
printf("count is %d\n", pshreRAM->packet_cout);
$ f: p4 ]9 l0 T4 v- Z6 c+ K E
count_copy = pshreRAM->packet_cout;
2 _6 o$ @% {& m* X" `8 v
}
7 E/ d1 T1 x3 Q Y1 G, W, T
else
4 f# `6 I& g9 i! y d
{
3 h' F9 @' I1 k0 U
printf("No effective message!\n");
, {1 A* A, a7 P2 @# G; b
}
& B% G; t. d) o& |* h4 m+ b
}
9 U5 n/ B# o* r. z" {" V
9 U: Y- q6 Z3 P' z% k- r. h5 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ n) z* e7 n9 F7 y( N) j
: B$ W6 _4 q" T ]' n
" ^) S6 A: _. }* \* T' L
/ A% P6 J( b, H$ y( @" X5 ]
2 T' F. X7 q* X7 C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4