嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 F% ^5 l, [$ q8 m3 ~5 z8 T; W& k
3 F s1 v8 j' Q6 W% l* t2 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 N" D: |6 X) C' a! X6 k; V) v, Z
#include <unistd.h>
! P# t+ S1 q5 v2 L
#include <sys/mman.h>
! X8 p" k) N- i" @& z
#include <sys/types.h>
7 f& u/ U' E0 f5 O: W4 I
#include <fcntl.h>
. c1 l$ S2 x4 j8 }/ D$ z
6 H9 x4 [* k- A4 _7 W9 @6 {: H1 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 I# r8 m; k/ s& I1 ^8 o9 E9 {; k
8 y* j9 w% X+ Q) i" L/ z) C: T% ^: }
typedef struct
" k; W9 [' L+ o
{
" W; H0 q, s5 X: X7 ], r% O2 h3 y
unsigned int a;
5 t. p! ]' T0 K, a0 D% r
unsigned int b;
9 S1 `7 F$ S8 G4 t0 g& M* D) K4 o
unsigned int packet_cout;
% F* d% y2 D8 q" z; r* B, N. o: G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A3 x) x1 d3 c" ]/ Y! Q$ ?- \3 T
. d7 s9 ^9 p8 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 i* j: c$ m7 W' J8 d" G9 H
unsigned int count_copy = 0;
/ v3 N: d) G2 [3 |+ i
: n$ a4 @. K- I' N
* k5 s( k& ]5 T8 f* X2 A$ P! B" e
int main()
9 E$ F% X7 {" U- T7 ^
{
" q* X s, A6 Y0 J* C
pRX_MSG_PROTOCOL pshreRAM = NULL;
) u8 U$ ?' F# L* d. M2 H9 P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" B* o% A& O2 h6 u
, a7 ?+ h3 o k7 w1 a$ b1 {5 n
while(1)
" k: R2 e: d$ O5 q& _/ y2 [
{
' U3 {/ \- a& d3 k9 r* n0 v
read_MSG_buffer(pshreRAM);
6 W3 u! v$ w7 w; W
}
/ |0 p* y! k ]# O! N8 {5 I
}
, Y& ^+ C( o' a# Z- b" M0 _
1 \: j7 l6 ^# }# @: [1 K$ _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! F% M/ `4 R! Y) r0 h: Y6 ]
{
" X$ u) D1 c7 J/ u/ \
RX_MSG_PROTOCOL buf;
9 d- D2 h( \, q( \+ ~; R
- K8 |$ u0 O8 Q$ O6 k7 S& }
buf.a = pshreRAM->a;
9 _; q& h" B6 i1 L
buf.b = pshreRAM->b;
4 v X A1 A/ D: N' N4 O3 K
buf.packet_cout = pshreRAM->packet_cout;
; G$ v1 a( U' n
- O( M, n8 G, N. i
if(buf.packet_cout != count_copy)
+ T( M9 `% ~5 e- s. w; f% w. Y" e( N
{
% X% {; T1 [1 x& ?8 H: U/ G {' [4 @) H
printf("a is %d\n", buf.a);
R6 P' P6 x6 V7 v) ? |* Q" Q
printf("b is %d\n", buf.b);
# _0 p! A- U7 p- D6 J
printf("count is %d\n", buf.packet_cout);
; k$ p+ b6 J6 V6 v
count_copy = buf.packet_cout;
$ Q4 T) N0 k3 Y+ {' B
}
* z% b% E1 g; y4 f1 z
else
9 { C' k; W6 b( J& E
{
* T; Y- G+ F3 b1 B/ b( j& u! s+ [
printf("No effective message!");
* M5 k9 }( | p& {" m; w
}
- h' }) M0 A& h2 C
}
3 q0 s: r+ G5 z+ ]/ b
1 Y& T+ R0 E9 S! l8 ?0 r
/ L( [% p. P' n: _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ X5 z { _, N! i3 w$ y( Y' A
使用下面代码,对内存使用了mmap函数后:
" X0 `5 T0 T2 ~3 H! q% B
#include <stdio.h>
% A. y; Y5 Z# T% C. Q, I- ]
#include <unistd.h>
; Q6 J, B$ ?/ ?1 T! p% C* F2 s
#include <sys/mman.h>
: V; I8 \) f' ~5 _7 E6 ^* Y
#include <sys/types.h>
1 r) e$ A+ A9 m
#include <fcntl.h>
+ ?9 Q2 S( O; D. f
7 m3 Q- q/ A6 y: K: i' {3 a9 F: W1 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 f0 w+ I7 R( C. D, D
#define SHAER_RAM_SIZE (0x20000)
: Y4 b, r8 ?6 a* P, P" A
! ~: } d. }, n5 E6 q/ `
typedef struct
# S m# y: Z9 B& K
{
2 Q8 V& G! J7 o" C3 f* _2 k. M' ~
unsigned int a;
( C1 i# O( M2 U8 S/ r
unsigned int b;
7 C+ a' w: P$ R) a3 ]+ D/ l
unsigned int packet_cout;
% b$ H( y0 F# `% w* j1 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; Q. N: u8 c' X9 L4 N% ?. W
5 ^, ~+ `5 Q2 q% x0 t- d8 F
void read_MSG_buffer(int *baseaddr);
& z3 g1 ?3 D9 f2 P. f+ `4 [6 E
unsigned int count_copy = 0;
1 D3 E$ n) V/ r8 d6 x! ~$ \$ S& ~& X
0 _3 L9 @0 |$ a, b
int main()
# T: Y( I* I9 d& S, g1 L
{
* v# g0 w4 q: W7 P2 J W' F
int fd;
1 e+ q/ y2 ~' m. q/ `
int *mem = NULL;
7 @/ z' C$ h/ |9 L1 y& j
+ x4 M& P; v+ y8 a/ {, r
if((fd = open("/dev/mem", O_RDWR)) <0)
# R1 h# m& M" \$ Q
{
4 E% s7 G) r; ?! O+ V0 a6 P2 P
perror("open error");
7 M( H3 [- D7 U- q' h2 _: y
return -1;
! x: D9 r1 v% x7 w K/ I
}
' v- q7 g' z% z# Y$ E Z# g
" x7 G. W" f2 q- J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" C' E+ w$ P# e$ u G
8 L6 E9 M9 e' p2 T
while(1)
/ X1 w4 {3 I7 G/ {+ C" p6 B
{
/ n: q! O/ U9 @0 P6 `, g( Y) f
read_MSG_buffer(mem);
& B2 T% b* k4 k. W9 x3 o$ g
}
6 k- O, a3 j/ u, l" Z
}
! N3 _( |! u" h$ n3 C9 V( `6 m
- a6 G, M* t( _. Q2 {. l; [
void read_MSG_buffer(int *baseaddr)
9 E7 m# b8 W- M0 U j' S
{
6 y5 X. x8 ^; {
pRX_MSG_PROTOCOL pshreRAM = NULL;
; w2 |/ l T* c/ z w( e4 A
: g! E2 t9 f g& A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ R, R: {/ C6 Q# t
6 u B2 O, d# e6 v
if(pshreRAM->packet_cout != count_copy)
/ L. S" r8 A. q* z d: F2 v% K
{
3 A9 A* @2 a& M1 T2 _) }+ j% }
printf("a is %d\n", pshreRAM->a);
+ q/ Q" m+ d4 t3 ?- _" e) q4 o' Q
printf("b is %d\n", pshreRAM->b);
4 p' W: T3 l* N3 n5 w7 O
printf("count is %d\n", pshreRAM->packet_cout);
* S1 L5 v% O- d/ a
count_copy = pshreRAM->packet_cout;
, Z4 z2 @3 A! u6 J! B& M
}
8 F% [- D3 ^* p
else
6 N6 @, `% L( H7 h9 F. ~) l/ T; O/ ~
{
4 E9 x# ~- G8 s/ a1 q1 i
printf("No effective message!\n");
9 l; a. L3 P! V+ h0 o
}
" P# c. i; W( t& j5 f
}
# L w# p* P. o" Q. s
8 i1 [ h8 N% v E7 z& @7 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ G8 D9 s/ j8 f! i! e: {5 ^# T8 i7 P
1 g* \3 S1 F" C: f
& E: E' M p4 C% A b b. i
3 A: q* ]" ?; A
) _% p: a: ]2 n; C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4