嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( v. j, e) I* h+ H6 E
k$ @; m. x, q3 o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& {5 ]* O4 H3 @& q8 [; @
#include <unistd.h>
, x, \, m/ r, Y) V$ M4 D
#include <sys/mman.h>
' r8 ]- w4 q O, `( `+ x0 s
#include <sys/types.h>
& W. \. B9 Q( r, Z: |( |
#include <fcntl.h>
$ |6 ^* ^; M) m8 D$ ~- h% l
, w% o' D7 Y6 n7 [4 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
: \) j' B1 b( j* ~) @ x
{8 G# m* s/ u0 a3 H2 F
typedef struct
& H, V9 p8 ?2 p/ D. W
{
0 `% H. U7 x/ m! l# F* O6 J- P
unsigned int a;
. X7 z# [7 I$ k0 [2 ?9 n
unsigned int b;
) k: Y, l" Q' a1 a. {" u. S9 o) m
unsigned int packet_cout;
+ ~. A) X. T; l1 Z& s# c( ~2 V$ K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' y( f. p/ L4 A5 h
7 H/ i! F( p, B. v% D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; ~% U \* l) H$ [9 F
unsigned int count_copy = 0;
" K, r; b d9 q( G% |
* p. ^. d( S! |/ ?) @) o
; ~9 j5 i+ \' ^) j# F @
int main()
* y" h, }) c, n5 B
{
0 [2 X1 _7 V$ `: g3 q B2 T
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B) r, g7 `! q ]0 b1 @; P: X' C% c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 [) Q) g4 ?& U- a6 Z& @
# \: i W7 a, y, X
while(1)
* J" v" T4 i+ \% Y: a8 G
{
6 T9 F$ z- v8 {. H. a
read_MSG_buffer(pshreRAM);
! ~1 M5 [& I1 u1 x' b$ g: D
}
' }5 G0 b. E6 P R3 h0 F+ ?- z
}
+ W' M; i7 T/ ^6 m
. W. e5 ^, }. C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 w7 ]' H& Z5 S/ q# s- H
{
" j2 p1 [+ a$ v( u, d
RX_MSG_PROTOCOL buf;
$ X" C' y+ }: C5 `& `* c- A" T
4 B7 S8 V0 W0 \8 P- p, i% w
buf.a = pshreRAM->a;
0 Z' t" t5 h: T) D# c3 s2 t H2 S
buf.b = pshreRAM->b;
( f; H' k; X7 K
buf.packet_cout = pshreRAM->packet_cout;
! l Z0 W& ?3 x
- L6 {0 r2 \8 R( g8 @$ x0 ?
if(buf.packet_cout != count_copy)
0 Q4 @* B3 B: ~- X9 d' a/ f- g
{
; C$ h3 l1 H+ t- G: k) t
printf("a is %d\n", buf.a);
1 g3 F Q* I2 w; w. r$ q5 B7 V
printf("b is %d\n", buf.b);
1 n% j% {8 d4 Z. p+ R
printf("count is %d\n", buf.packet_cout);
1 h# k, F! \5 i& X
count_copy = buf.packet_cout;
& I6 ?, |1 }2 |2 d
}
4 c* U1 c3 L+ U' Y! J C
else
$ o I2 ]2 N" p/ |
{
0 g! a$ ~2 P& y# n3 A' _! u# m8 W1 D
printf("No effective message!");
6 i4 r2 {+ i- Z& K& S, }3 s
}
* H% ^ X( `1 {) H5 T
}
; O5 I. c1 j0 W8 L
6 v. C4 c$ R7 T2 A, e q& y, b4 a
$ n: {, K1 z# h5 M) f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; ]/ j) i( S3 |( ~( v
使用下面代码,对内存使用了mmap函数后:
7 l; a/ Y3 i/ w I# u( e
#include <stdio.h>
+ i, `: Q3 b5 w9 m3 G& ?) F( A
#include <unistd.h>
: L' X7 t! z6 a+ c1 P: {3 f
#include <sys/mman.h>
) s5 }* m3 h2 n/ [! W2 |1 o
#include <sys/types.h>
! Y! E9 [9 a& @. X
#include <fcntl.h>
+ O% A" C) W4 ]" {
! f7 b+ o5 I7 g3 F% q) I
#define SHAER_RAM_BASE_ADDR (0x80000000)
* w8 s) O/ a' H/ c. `( \
#define SHAER_RAM_SIZE (0x20000)
2 [9 b& X) S" R. i' r8 d h
; z" A9 a$ l1 p9 D1 J# _
typedef struct
! L6 s% w, @/ z: S( O7 Q Q# k- I6 O) r
{
0 C, T1 u i* R$ R
unsigned int a;
% U4 d- S5 y4 H7 \8 v$ }
unsigned int b;
6 z: a3 H2 F; {, b9 {, `' m
unsigned int packet_cout;
% z( q4 n) S1 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 E: E5 E2 |. T
- U9 V% \) m _
void read_MSG_buffer(int *baseaddr);
9 k) v. _1 p+ q1 c( E
unsigned int count_copy = 0;
2 s+ x D7 @8 l5 K1 E9 P5 ]
( p. N j" `1 \5 ]# r1 Z
int main()
. p" T# [8 H" @) r9 o% H) W
{
5 h+ H, L+ n4 m/ `! [
int fd;
' s+ e* L1 ^# {; v# H1 f1 ]# j
int *mem = NULL;
% o7 z1 C2 [; M6 Z* p, g3 _% q4 e! M
9 m: a d7 s) `7 G$ H8 |: A
if((fd = open("/dev/mem", O_RDWR)) <0)
3 f+ D& w' l' z. v+ @8 P
{
$ u' K2 X5 t, v
perror("open error");
^* Z* M, @/ V4 _4 h6 `! D$ N
return -1;
6 @9 ^, L2 q" A3 P
}
: F6 v* S& F7 F' }$ t2 g
( n' G; y$ a$ y9 F _/ f3 I0 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, K; P P, E% D+ Z% i, x
1 b/ L3 A6 Q& j
while(1)
5 l \8 p& [. G2 V6 @7 m2 h
{
6 \' Z ?# G R/ j1 H; h2 u1 @' b
read_MSG_buffer(mem);
8 }/ X. L( e, D+ |
}
8 G; w! t2 ?# u
}
+ B- X# | v) f4 x1 g* Y& d! o, H
$ k" Q& D' @: o0 s7 L3 l5 z# s
void read_MSG_buffer(int *baseaddr)
5 l: _2 Q/ ^& b2 P
{
( d# w; }$ @/ ]: K. S8 ]. G& |) C
pRX_MSG_PROTOCOL pshreRAM = NULL;
! h2 w8 E: v# `1 B$ W5 T! [- y7 P
( r0 B# E) D4 ^' t0 G6 a! r" B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 c1 {. s6 f! h9 H* \
; p j2 T- e* T& k
if(pshreRAM->packet_cout != count_copy)
3 X! l. \( s- y9 ]% m3 u: R! J
{
/ X0 L8 s* D% o' K- s- P
printf("a is %d\n", pshreRAM->a);
" o* ?6 {" }8 }4 K9 X% H; Y2 Q
printf("b is %d\n", pshreRAM->b);
* V- j$ ?: n# }, d* z$ ^
printf("count is %d\n", pshreRAM->packet_cout);
9 ?: D) w7 H8 K+ G: [9 J$ d
count_copy = pshreRAM->packet_cout;
! G% V. G7 o$ w: b+ R2 M
}
( h3 s6 h0 t" S+ _* {- m% j* w$ X
else
8 `' t/ N3 n4 }/ S5 F3 A/ K) N) d
{
5 V$ d4 k# t4 @' z0 ^* y8 ]3 j. H
printf("No effective message!\n");
) ~; M2 U3 u1 d* I) s# A8 `8 Z
}
9 H& Y3 z2 `) t6 e/ I
}
+ N6 \9 z' h; X
) J6 C6 J& M7 |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 y# |0 i0 F6 E, G# a& ~; r
* I) z2 m$ S' x U' K9 C6 x( a
5 [ \: J; x o
4 V3 K! R0 N' `* |
- v) k; z1 e9 t6 W. [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4