嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( g; p* }2 F: ?, p0 g/ }0 }
$ D, W2 R7 K( [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Z- Z2 V% \; N, G: U! |" j+ S% p
#include <unistd.h>
d6 C L& ?) b! w# Q% c9 ?
#include <sys/mman.h>
& \6 ^; r3 m4 W9 `; J7 r+ ?/ }
#include <sys/types.h>
. Y) L/ T& i" O8 m& u6 ]8 E, T
#include <fcntl.h>
* u9 }4 L; |6 o' u# B, E
. S% A+ G# `0 ?- Q9 _
#define SHAER_RAM_BASE_ADDR (0x80000000)
" n7 G7 s! t+ l4 C- Z, M3 B
1 f% W/ n# e" E" c6 m3 N
typedef struct
$ [; r5 g9 _1 q2 Q+ ^9 c# v
{
8 K1 Q: \4 Z0 A
unsigned int a;
, E# o8 m. f6 J: x
unsigned int b;
0 Q/ B" `1 X- T8 y+ t* A
unsigned int packet_cout;
1 \- `2 j: v$ |: l& L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 n* @, l4 R, Z
0 p3 z9 O- \4 o* d5 p4 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! C6 h4 d+ O! |, ]7 E" Q
unsigned int count_copy = 0;
6 `0 k. V8 n9 ]7 G4 z }7 f. e
% M* r, p C3 R
) W& G4 A2 c/ q- [. ~
int main()
- z$ H9 w- C8 L/ W
{
2 H9 `$ W( H# i7 G, e8 P8 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 {. r# ` ^5 r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! V' o+ t& t8 W, S
* T' ], v: z+ s/ C r9 t
while(1)
: {& v, }- m l3 c6 ~- A6 ~" @4 C
{
$ z1 ]9 @# R, w
read_MSG_buffer(pshreRAM);
1 L& d5 h+ e1 y7 v' z$ [0 `: D+ q: O
}
; @2 p r0 F7 I1 g) K
}
! ?& y% M6 N) j. D5 t
; g7 }! b% V$ }: N. i3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! a6 G) B- _8 G, Z; }& [2 T2 Y
{
! ]5 ] v! @! a2 a9 X% R! M
RX_MSG_PROTOCOL buf;
) a# t# f) g% Q/ i, r! ?
9 p# a$ s5 M% `/ P
buf.a = pshreRAM->a;
; Q0 H/ G% r' q1 ~+ q6 \% v! h7 G
buf.b = pshreRAM->b;
Z e6 ?/ Y2 y f1 x2 E3 f! l6 g
buf.packet_cout = pshreRAM->packet_cout;
) j' a1 n! m5 o
$ k# V+ i& S) H5 j
if(buf.packet_cout != count_copy)
8 ]% u" t" C* M
{
: L# T* R# ~5 l, v- g1 d
printf("a is %d\n", buf.a);
1 R3 ^5 [' C$ K6 d( g$ H" c/ T
printf("b is %d\n", buf.b);
9 u0 d, Q' [' b) [& n
printf("count is %d\n", buf.packet_cout);
( A8 F1 `( w8 V8 ?1 J
count_copy = buf.packet_cout;
+ N' a0 h0 |) E2 _0 I- I4 p2 C
}
; H1 |3 {: i4 x* G' `3 v9 h! g& Y
else
: D5 U8 U0 L2 w& `3 j) T
{
$ l( k3 N' p6 C8 n* E
printf("No effective message!");
W; g: m/ X5 L3 x# Z6 O2 M$ D! g( m
}
( h% T" ]- ?% A4 Z( x
}
1 }; L& A( Y3 n0 f, }9 s
# A: Q# _7 }0 C' R9 E$ j) |
3 H# B, ?, O- h; v6 Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 Y, e4 T& t! n2 o2 R
使用下面代码,对内存使用了mmap函数后:
. h: n) L3 } s! R- m- J" E
#include <stdio.h>
9 p: @. |4 n: O: ^/ n* e3 u! e4 }
#include <unistd.h>
4 U3 ~) b* h% l
#include <sys/mman.h>
* `' Z: X$ v% e) S5 p6 ^
#include <sys/types.h>
* ^! N8 c1 v2 A6 V8 V1 _
#include <fcntl.h>
- b" o) Y; R {: [: u( E! e& q
1 N# {8 b# }# g' R
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ `: y3 G' H+ j, o4 [5 y( p
#define SHAER_RAM_SIZE (0x20000)
+ E) y, `/ F3 `) z- u6 D" l5 S3 t
6 q8 U6 b# L7 `: ]2 w! H
typedef struct
, o3 _* z+ Z- G. `6 C) l+ I
{
5 z+ R3 Y3 O; x4 J; A8 K4 k
unsigned int a;
! L5 c; r4 ^& ?$ a6 Z, I
unsigned int b;
( S3 K. I. k x! X) B
unsigned int packet_cout;
" I5 E# m. L6 z$ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: w$ r* [1 v$ u" z2 s# L- t; h- l
M/ q' E! X$ U" T9 a+ A8 b1 _ ~
void read_MSG_buffer(int *baseaddr);
8 Q; N+ a, h. r+ {- N4 z
unsigned int count_copy = 0;
5 n0 f" \' A' H; Z
2 }6 u* u3 V. @. P" D
int main()
" y y1 X+ d3 M
{
* e6 d1 b' [2 |' l3 k, l
int fd;
" Q5 K% o7 W' U1 k- J/ l: u
int *mem = NULL;
+ ~/ f- S/ `) \/ y) L# Q7 C
2 V* Z2 x; Q! l; w" X
if((fd = open("/dev/mem", O_RDWR)) <0)
* {5 o( t8 ^# l, }. z L
{
' P# c+ j/ J; t/ P. D1 Q
perror("open error");
$ \# L0 P. w+ G: E% Q* j
return -1;
" B F5 y/ m( M" L- A4 i( l3 S
}
! c! d( g: {8 F6 a, m0 U' e9 T
* i/ x9 H* g2 H8 R+ x K. [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ R+ `( n! N8 x( r/ I
6 ?; P" G Q9 C" \9 H9 B
while(1)
: e2 }) B9 v* T! O& h% E1 c
{
$ h V' Y: c; j; @2 i5 H l
read_MSG_buffer(mem);
, C9 k5 j9 _8 V4 y" J
}
6 } Z6 g5 K' M6 h
}
8 {+ L- J0 e1 Q- e
" j) g% q; i5 h% K v, w( ^
void read_MSG_buffer(int *baseaddr)
?, R; C; G8 ?! C$ B7 e) n, d3 v
{
; K; |. @( [6 C8 e S% G
pRX_MSG_PROTOCOL pshreRAM = NULL;
! @9 ]4 Y H3 }: @
" K" t; c. B2 d! i4 ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 X1 F( U, I9 O! x d2 S
- w8 A1 Y0 [" ~# r; |( _9 ]' Z3 \
if(pshreRAM->packet_cout != count_copy)
4 x7 {3 L1 w' I4 D z2 H
{
3 g" }; l7 l9 Q
printf("a is %d\n", pshreRAM->a);
9 g' {8 F- }9 G7 g% S
printf("b is %d\n", pshreRAM->b);
) t5 J" a& u0 @, n1 w/ R
printf("count is %d\n", pshreRAM->packet_cout);
$ g( B' {1 l2 d# M; L# @: V+ y
count_copy = pshreRAM->packet_cout;
1 l5 z# R5 Z# r
}
: O3 ^4 R- y! N* I
else
/ I$ f/ S" b5 e( a, b
{
4 W$ k: n# z1 T& a
printf("No effective message!\n");
& ]9 e+ G5 o$ p! H
}
' g' h4 e& ?. [# j
}
j. c0 j6 G, W8 z+ q: H
. e" A0 a% G5 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' K" P& {1 _( e- L# w9 G
& E0 b$ Z3 E7 M, S
8 j0 c: W# a1 z5 M# ~8 @' a4 H: H
8 K/ F* ?5 Y! |2 _' L. ?* t
" ~4 M- r8 u, F/ m* Q. L/ m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4