嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 s% }6 P: p- d4 X& \1 _
5 F9 L! q: Q$ @! a1 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 `: w0 {4 D3 f" e
#include <unistd.h>
0 v2 `& L) t% w- s
#include <sys/mman.h>
( U, A# c7 K. k- ] Q" Y; C+ N, N
#include <sys/types.h>
- A$ T! s" s3 k
#include <fcntl.h>
/ n) b! s g8 n/ `3 X; A
$ q$ j& h. [8 x1 O' B. `. L a" S# j: |* N
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 ? w0 j3 G* y
; T+ H3 `* m q x. ^
typedef struct
+ v& ]; h! E/ v- v! F3 N
{
$ u8 k/ o6 L) Y! l
unsigned int a;
% w7 _2 i9 K, t. s) ~: i7 \7 b
unsigned int b;
7 z* H' p" X. U2 z' B7 H
unsigned int packet_cout;
) Q/ X/ g V) s. l' N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# f: E% X2 t0 _2 j1 G( ?
# d ]% T7 p( Y# [2 q3 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- X# u- V: C: [3 X" [
unsigned int count_copy = 0;
1 F* P+ v \2 W- `' ~. R" `1 Y) \' r+ i
3 j( C' u7 v# P, J$ n6 D
3 o8 o0 r, e0 v8 a: k1 W
int main()
' c* f7 t9 I' R+ M; V1 j9 t
{
4 D! I m5 q0 T' q
pRX_MSG_PROTOCOL pshreRAM = NULL;
% K: d8 v/ G4 t# d4 R0 H9 s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 d+ r' A( V$ E- x. c+ t3 l+ h7 T: G
4 v! z# Q5 [; v) U9 L
while(1)
) Y/ P; ?8 |) t; L( O: d
{
1 u' J0 |* S: _4 r* b8 d8 O6 J. L4 j
read_MSG_buffer(pshreRAM);
0 z* @& W3 s& Z2 k" q
}
3 F2 T: m3 X! y# e
}
+ |4 w. k1 v/ `# g* `& A
$ [/ s- T" u ]: @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 Z2 \; X2 b/ t q/ H
{
1 Y1 X& a) V( U$ V- {7 c h o; A
RX_MSG_PROTOCOL buf;
0 _3 m0 m6 R9 A6 {3 X
- r4 k* V6 S8 u8 h. o0 O: w
buf.a = pshreRAM->a;
' D, M$ J' w3 s
buf.b = pshreRAM->b;
8 E# t$ ~2 X3 W+ G2 ]& m2 [
buf.packet_cout = pshreRAM->packet_cout;
6 V/ @3 [ L. x- v& g- y
7 ^( v2 h% V/ K2 H
if(buf.packet_cout != count_copy)
9 J+ h7 q/ W6 w
{
2 [3 V; W/ M/ j$ a! i# w6 ^* G
printf("a is %d\n", buf.a);
3 t+ f% W! S& ^5 u2 d2 e
printf("b is %d\n", buf.b);
% Z$ f0 }0 K' ?% E* \. j+ P
printf("count is %d\n", buf.packet_cout);
% G* O1 U1 W6 Y) H' I- w$ `$ q* @
count_copy = buf.packet_cout;
5 j: M" b; {0 z8 b4 m& ^$ [- c, d
}
% I! Z4 q' M5 F7 e
else
/ t/ x7 h" E6 @
{
+ m/ Q, `/ B. z3 g. U% L* f) c2 z
printf("No effective message!");
! w' E. E: S6 F# _4 D
}
" G- ^/ f" K! _' B; e2 a
}
; R* A0 l- q, u" w! i
# M& Z; [: @* o% w
7 R% ~2 Q0 `; s. V8 d- s% m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' T# p6 ^1 M) o) ?. s
使用下面代码,对内存使用了mmap函数后:
+ }8 V% P+ R* f l
#include <stdio.h>
/ u- [* ^/ ^. i9 p: V$ _7 ]
#include <unistd.h>
) Y1 A* o! V' b0 l2 K9 i
#include <sys/mman.h>
& A4 H) Z, Z4 `) i& S
#include <sys/types.h>
0 [" r0 B' K/ z5 l4 X
#include <fcntl.h>
4 H- q8 \+ F6 T+ d2 E, W0 w
8 N: Y* [, ~) J
#define SHAER_RAM_BASE_ADDR (0x80000000)
* H& q. g! C) S# J8 U
#define SHAER_RAM_SIZE (0x20000)
. B0 f4 C7 j6 u( k: o
* H: @& I- Z3 s, f1 U4 A
typedef struct
3 L; s2 K; q [( x9 A* Q9 Q
{
8 T" r% ?; b, M h2 h; Z
unsigned int a;
2 b; Z4 V2 k, Y
unsigned int b;
% K* _9 n3 U5 v5 s3 o7 B% Y6 i
unsigned int packet_cout;
. \ s& B2 j7 H1 g4 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 B1 u# m9 P5 Z: I) M4 H
/ |" l6 K+ d5 {1 v: J
void read_MSG_buffer(int *baseaddr);
" B d' j5 G2 b' |4 J' f
unsigned int count_copy = 0;
0 k# y% O9 S+ E: _9 L O# _
+ U3 O8 ~ b% _/ o/ N/ z2 b
int main()
D$ F8 X4 G5 }+ L9 @' b( E7 L
{
" R# Z. I% o5 ^ M8 p+ V
int fd;
0 M. B5 V" V y: b
int *mem = NULL;
. m2 q5 z) e! a" ` I' w4 ~
; o- R) O! @: Z
if((fd = open("/dev/mem", O_RDWR)) <0)
$ c1 Q- d2 D( _7 j1 F
{
* ]$ J& p6 T$ H1 A+ H% E( |4 c
perror("open error");
! ?! k! T. y9 A; o
return -1;
, @) R8 p1 v1 C! Y3 c T
}
/ R6 y5 |- U( L1 n8 K0 E6 P3 x9 m
$ C6 n3 }; d$ }% j9 F1 r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 D+ c6 _. T9 i9 X# T; z# ~2 b
" O$ ?: I; Z y- v5 \3 t7 j, F5 C
while(1)
2 m* w* d, T, g5 s: [. y
{
' y/ N: \1 ?$ n) \: b1 Y" F
read_MSG_buffer(mem);
\5 x1 m; U. B% c$ r: ]; `9 w
}
/ G: L+ x1 `$ j9 p
}
2 r8 y! U" w& \: C
+ E/ z* q* ? x$ Q+ b9 f
void read_MSG_buffer(int *baseaddr)
3 m f0 F' q! ^+ B z( H) N
{
% `# P9 m) I. s$ k
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J1 g1 P: i' A, p9 a# Z9 }
% k* y/ d8 y1 L( l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 L+ V7 ~4 c8 W* p
: @, n, Y w! {6 ?! V
if(pshreRAM->packet_cout != count_copy)
$ F W' a1 G u
{
( {- R% \4 ~5 g6 v
printf("a is %d\n", pshreRAM->a);
?2 s! u2 q8 ^9 k
printf("b is %d\n", pshreRAM->b);
/ e* v2 q3 ?$ h9 J: W- _# l$ Y% k
printf("count is %d\n", pshreRAM->packet_cout);
R% o6 ^5 @" w% f' n; d. S
count_copy = pshreRAM->packet_cout;
8 _! h& I' j6 c. x, @
}
0 @- r8 d' ?1 ? U
else
6 g/ f+ g$ N2 I; X2 k
{
5 ]/ D! t% I7 {. [
printf("No effective message!\n");
/ v+ o, J; c# H* z
}
$ C) Y/ U' u: R9 a& S; S
}
8 ?) f" R* U7 k' G
- F ?" F2 E# v8 r% u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 A) F( w5 N9 d& y( T8 S5 ]
+ e" O8 `9 m9 x# c9 T( P# H
8 H) | k3 Q5 j9 V$ U
# o; C: [( a, d
~% s2 q) b2 E+ F2 t$ ?$ z$ ]( E6 ^8 h* _
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4