嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" f9 q5 Z7 `9 N3 z, p6 R. `
5 l# ?" M) G9 a0 L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 g) T) w% J2 I, u% E: p, `
#include <unistd.h>
- q* w5 x) F* r. Z4 l5 |# N
#include <sys/mman.h>
7 N3 H5 {# x! L( l! s, @
#include <sys/types.h>
; [) o0 V: q% _- f5 r; S9 A/ g
#include <fcntl.h>
+ R7 v% J7 S; @, Z( k
6 ~& N- j) h. t
#define SHAER_RAM_BASE_ADDR (0x80000000)
! W+ h, ^& U- [9 X6 o
+ u: D% _8 K1 {* _2 B! W
typedef struct
3 s- e$ M$ g+ B+ I. {7 n$ P
{
4 ?) S; H9 d' S r7 ]5 Z
unsigned int a;
! T5 \9 S3 Q: m
unsigned int b;
: [! u1 b- b( X: G$ ~6 V/ W
unsigned int packet_cout;
8 a9 l2 @% Q4 U( y. ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 P& o' W! Q" M) ~
/ E/ K* R3 J: u3 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 |) R) n _6 q
unsigned int count_copy = 0;
9 l3 _2 [8 \. e7 ]8 f
! c. i9 Q* D# K
/ r4 D+ M, S4 S& M+ F7 H2 B
int main()
9 O- g- ?6 F* K. j
{
* S! v- R- w# O- g
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t D4 I0 [, f/ a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
t6 u# y5 Z8 y7 s4 m1 ~
& [; R; c8 t; Y% H9 \; w
while(1)
' z! i8 ? p/ J; G- O7 ~/ Q; C
{
# v6 u( w& a; W3 H$ ?% P
read_MSG_buffer(pshreRAM);
+ y1 E; g! s0 {' X1 t# F$ q+ v
}
. u- X- c; _# P* U) Z
}
5 C: A3 n( s* j! s
8 M3 W, {: j+ K9 H5 U0 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P# M# T! B+ `! g4 |& ~" l
{
' K0 r/ f; x" l& Y
RX_MSG_PROTOCOL buf;
9 N9 X/ @% r6 N+ T. }* t% b* ]0 t3 u
: J6 P. u8 D1 j$ r/ o8 I3 Z
buf.a = pshreRAM->a;
: ]+ V: \! }( |0 e" U. E0 j' I
buf.b = pshreRAM->b;
3 S" D; G3 T4 U
buf.packet_cout = pshreRAM->packet_cout;
4 q+ h) p0 o5 i D( Z$ G
7 B' s5 b7 i0 V: X$ U7 w! m
if(buf.packet_cout != count_copy)
0 |& Y$ ]; F# \ n
{
; R: a. @: }8 r7 D
printf("a is %d\n", buf.a);
( H7 v4 X( a" e- V; J
printf("b is %d\n", buf.b);
9 B0 W" }1 I/ O' a9 p H
printf("count is %d\n", buf.packet_cout);
' C5 M8 y$ X/ T3 p7 R% Z% N
count_copy = buf.packet_cout;
/ J% f7 Q+ s: F- j6 X
}
N* a- D) R: H8 K
else
# v$ W ]; s' d& A# z
{
7 g& z8 F4 I5 @: v, U) {2 n8 B
printf("No effective message!");
: H9 y0 D0 O9 e, [" B
}
% G+ {0 E9 Q. I9 {, [0 y8 L
}
. M$ b& J: ?4 N( M1 Y. x
* D7 J" d/ o6 A8 S* _
1 t5 \/ \3 C* W* x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 U! J' E3 T+ r8 ~5 `. o9 p2 N
使用下面代码,对内存使用了mmap函数后:
# C; C$ C7 ?# r0 |
#include <stdio.h>
* g% b' N& x; D- [
#include <unistd.h>
7 F6 @1 k& [$ P. F( P
#include <sys/mman.h>
) W6 j3 U0 O6 G$ S" B/ {3 l
#include <sys/types.h>
; e' E) h: ]& B& R" Z
#include <fcntl.h>
7 U N. ?$ X* R% ~( Z0 x8 Z
5 X @4 K% b" d4 E W1 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
; d/ B0 L0 }! n% J( Q
#define SHAER_RAM_SIZE (0x20000)
" X* Y/ H3 a& o
4 C& U: S- d' D% i9 ^7 i: v
typedef struct
9 R8 w3 t6 b: Y4 e' F! `
{
2 _4 q- X S1 f* }! _. T9 g
unsigned int a;
( d& Q5 G; d5 ~- R( K7 V: a* C
unsigned int b;
! \; J4 S5 T- Y ]- W
unsigned int packet_cout;
- w5 |# t) c b$ c1 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ W0 a. M6 z: |& j' B1 n& c
/ G( r/ I% S/ z5 O8 u7 L6 K! e6 e0 t
void read_MSG_buffer(int *baseaddr);
; R% h! j% v6 X$ B9 R& x0 ?" i% j0 ^# P
unsigned int count_copy = 0;
1 [4 [& x2 S7 F2 x
2 n9 w# g# `* F+ V0 ~0 K) L
int main()
- r, o( _9 U5 ]# l' b3 a
{
. _2 G* H( D7 O7 ]+ r
int fd;
# Z& Z; r: y/ F" x9 `. J7 }' Y- A% P
int *mem = NULL;
' c7 i. q& z) M% S9 ]) E7 C
- E, d; `4 f: S ^
if((fd = open("/dev/mem", O_RDWR)) <0)
, N: L, ~& g( g0 X4 M. P$ y, `
{
0 {5 J: s9 d( d2 i
perror("open error");
0 Z3 u3 _0 Z% y! U: l2 F! e) ^
return -1;
" q4 i9 x0 C3 i( A; v
}
& H! y! s" m2 z' U
4 p1 Q4 D1 } O \2 ]
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- j% M3 [! [# `! h+ o
+ e4 F/ {" P V5 Q/ t) D
while(1)
$ k, Q; s+ B( |8 a3 u( V
{
. F; ]2 t! e/ a9 E# o' F0 i( s3 _7 c
read_MSG_buffer(mem);
# P. G3 B4 F/ s$ o3 a1 e
}
: P. `1 h" D3 |3 [) y
}
. v1 S! x4 r. R- X
* w9 p+ q4 a9 _& O
void read_MSG_buffer(int *baseaddr)
3 V+ a6 c' h! {$ y5 X
{
2 z( v; c2 I0 w$ f1 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 y C* w! H4 r- ?+ `
+ V$ I, D- I5 C/ b5 D/ i6 u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
z# Z2 i/ ^) j: f
$ k( |5 Q0 o* E4 } J H$ x$ n
if(pshreRAM->packet_cout != count_copy)
; a8 G" r( O0 G6 n/ k( |
{
0 T. i) R! x# N
printf("a is %d\n", pshreRAM->a);
@% N0 K( W3 V: B
printf("b is %d\n", pshreRAM->b);
8 p' B! y6 b. s( ?7 J
printf("count is %d\n", pshreRAM->packet_cout);
2 F; `* a/ u' Q; T( X2 q
count_copy = pshreRAM->packet_cout;
' S) Q" A1 H) {8 {5 m
}
3 P# {2 B: s/ p2 _" N
else
( `! j4 E5 E) {' Z- w$ N
{
* X" Z$ z" z6 d+ y* k: ?
printf("No effective message!\n");
' x: B9 [% Q4 W& t" A
}
- X# ^# o* L. |% `
}
& K8 Q) e5 \& O/ b( X- [
6 L9 O9 H3 D0 u/ C/ F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% ]3 N- E8 Q* C3 y' F4 V0 R$ T
" h5 x0 w9 `; ]& Y' M: f1 k
$ |6 H& p6 M) ]1 Q. d/ m& i0 s
3 [$ R$ l T$ P5 | \" e
* C3 i4 M( ]+ L: O& @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4