嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* G J. h: W; [+ Z/ ~4 K
& W" G- J5 _- K* y; p! l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 }; D; [0 f. B, H4 i( U6 |
#include <unistd.h>
$ ]& \# p2 \' W( S- w
#include <sys/mman.h>
7 y* G8 p# P- { w: K( q7 T
#include <sys/types.h>
& Z' C2 y- Z i4 D# Y/ x J; o( {
#include <fcntl.h>
! T0 h9 R. m4 @; q; e
! k6 g4 p5 O5 Y0 m- B
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 \( q" z5 Q; ~; f) v
; \/ C1 |' Z/ r2 ^: Y9 m# c
typedef struct
4 d$ L. R) a% z, y
{
7 I" Q& f7 a7 L9 v4 _
unsigned int a;
' c2 y( X# J4 \& x( s
unsigned int b;
! ?( p; R! J; j2 ]6 K6 L5 I1 M
unsigned int packet_cout;
. z, s1 s" ]' e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 J# L7 u5 |# N! B/ X) q
# m" t' W; ?! B& W" T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ A5 W) j! ~! ?# T) d4 D8 j
unsigned int count_copy = 0;
8 l+ L& g3 A5 x- x" _
? z& S7 D. @% |) V) {# ?
2 R- O# r7 d% E- A4 F8 m8 u
int main()
. o5 Y/ h( c6 B$ Y! J6 m9 B! a" } S
{
4 b4 I6 ~' o' R( |* W3 D5 T/ ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 I$ K% @4 u- C8 |; ^9 t0 _! r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 d( f9 c. o) X% `6 L% m: ^4 i. U
/ M% v2 U% U# {% k/ p* p5 _8 G
while(1)
+ _ S. B/ \& _
{
. A* ~: U' V& E4 l# f5 E, w" \
read_MSG_buffer(pshreRAM);
! E% @9 L$ W6 M, m
}
. O2 b! J2 _; i$ K6 H
}
( ?* x# p, C/ ]$ ]! \8 a1 R B1 n! D
6 W' h2 Z$ i# o- D: j' v' D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 N; d( M# `# T5 r8 A1 s
{
5 `/ o! A- c! H3 F
RX_MSG_PROTOCOL buf;
8 ]7 C5 w- @# J
* P; o- \3 j4 V, [; O
buf.a = pshreRAM->a;
- ?% z0 v5 [. ]+ E5 Q7 q M
buf.b = pshreRAM->b;
* y3 v( c9 N( q* L
buf.packet_cout = pshreRAM->packet_cout;
5 @# a* w& Z: p8 L
0 ^% f d) ^! w+ @, m: X) J; r( F! H
if(buf.packet_cout != count_copy)
" p; M) R2 t0 ~2 `1 R
{
8 f/ H- h. K6 ~7 q
printf("a is %d\n", buf.a);
2 @% f5 N0 n3 F, S$ ]
printf("b is %d\n", buf.b);
6 t0 c# G- O3 N$ K9 s
printf("count is %d\n", buf.packet_cout);
1 D z1 M; e0 Y; p" B% a# A' B( b
count_copy = buf.packet_cout;
6 D, u) w( e- I' B1 n: ~, M( H
}
2 G2 A7 W' ~( d# v9 ~* j6 n/ x
else
) n, L5 p3 u" R
{
! Y0 Z& s; ?& I& ]
printf("No effective message!");
, e- l; ?. [- L# i3 N0 H
}
- R; E- J' g* l& }
}
$ O# Q! W# w9 `5 ^7 L
4 C1 S: P" q5 c+ j5 O9 ], C$ T
! z. D1 e0 X& G8 c; }5 d- L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: ^9 G+ u5 g2 `
使用下面代码,对内存使用了mmap函数后:
& m- b7 B1 r4 I3 p! H9 H9 \+ T
#include <stdio.h>
2 o; }# j( w P$ \: Y
#include <unistd.h>
/ f7 A( p6 }; i" I0 V! F
#include <sys/mman.h>
% l* g( Z1 I# p5 j
#include <sys/types.h>
% i" t; X5 l0 }8 \+ B' w# B
#include <fcntl.h>
" C. p5 |# q' ]) \0 I' b* e
+ v! v9 H' x. F3 e5 [9 {2 p
#define SHAER_RAM_BASE_ADDR (0x80000000)
! ^) |1 y' i, \; a
#define SHAER_RAM_SIZE (0x20000)
7 @6 R$ D' v7 N
* h4 \9 k: }" o3 L' K
typedef struct
. P* w G& A' K6 z, e1 T) T' ?, d
{
& r& ^8 c' B3 Y
unsigned int a;
9 |$ C; ^ H7 d
unsigned int b;
: g- Q# E. `8 _0 n
unsigned int packet_cout;
% F" o" w- D! q' N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- E+ ]8 ^$ }; i- g% i
' j) n3 ?6 t' Y4 h% s; [% F5 y
void read_MSG_buffer(int *baseaddr);
2 ~5 G5 `/ O0 L2 l; d& l
unsigned int count_copy = 0;
2 l- D7 U& B7 f' v/ N4 Q9 U
; ?3 ]" i: m% M6 ?9 `) H
int main()
$ s( t% N9 q' Q1 T0 i) t+ k7 c1 w
{
) t1 Y1 ~( ?: i5 L9 E l- d. o
int fd;
- H4 O* `, {" i5 ?/ L
int *mem = NULL;
) F+ z: [( c# ]+ i, t* c
1 M2 E/ d$ N% ~# X: Z$ Y
if((fd = open("/dev/mem", O_RDWR)) <0)
4 T% u* i4 ?" P& Y/ B# P
{
# l t ~0 s0 L- D) V
perror("open error");
* k0 ~/ c8 A0 k
return -1;
7 g, P& [& R' B; G6 } v+ b
}
( b- v3 K9 I8 h$ O
* V8 u. \7 q1 X0 n1 D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 F3 v5 n- K6 g4 `- s3 [
' z1 x0 O' T) m. ^* n' c% R' e
while(1)
1 V* D& T& n2 @8 W* J0 Z* Q
{
# o p1 C& V! X6 L% Z
read_MSG_buffer(mem);
/ p. \0 s7 h; e# j, m* g1 }
}
6 q8 q+ i7 }9 Q6 y, Y c$ w! M8 |
}
1 ?; x! F3 n- [8 N8 C! Y
- j b! k# |$ [& |- ^$ U
void read_MSG_buffer(int *baseaddr)
~: S! Z# T0 C! n4 C
{
! ^- X" [+ c; f
pRX_MSG_PROTOCOL pshreRAM = NULL;
& `" {: o' [$ {9 ~, b& a* Z
3 B. @6 j! Y% W/ i- y1 j) L& o" v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% {3 M9 T/ Z' G2 g- h, T q' c
& I) e! o" X& `5 i6 R' @
if(pshreRAM->packet_cout != count_copy)
" n5 ]# u4 L! D
{
: Y" {4 _0 v9 q T5 a
printf("a is %d\n", pshreRAM->a);
& t9 T: @( ^9 @) H' {1 q
printf("b is %d\n", pshreRAM->b);
, C4 B% [- ~/ R6 y
printf("count is %d\n", pshreRAM->packet_cout);
2 x4 @4 `. V6 \% W) A4 B
count_copy = pshreRAM->packet_cout;
, i( C* K8 x" b* m6 u
}
# A8 g% b3 Y! t$ c8 j z8 s" k- O
else
) J5 m4 }1 M0 S$ s% v4 X6 j* w
{
: a3 K: g1 S8 W8 P8 A) ]$ T
printf("No effective message!\n");
& ^2 p& k0 z E7 y- X: N
}
0 U$ \4 C- M9 P- c2 p) N& d
}
) m6 a, X0 w. S1 m3 h9 ]3 \% V$ r
( V( }/ W; l: U$ n; [+ S0 O$ i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ R/ {+ \9 P: |$ w, `# ?0 p
6 m; C2 Y4 H& U" |. Z0 {1 t! g
9 w4 D7 w+ Z# v) V5 v
6 q. V: @1 q& M
6 J! B% R6 b8 r& ]! s0 D
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4