嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 T$ o4 I% S+ U/ x/ l q( T- E% P* f
) g8 z& @6 J1 S5 H, E& ~4 P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& A/ M& ?6 w M' b( G
#include <unistd.h>
( ~, B8 t- k7 G( W$ E
#include <sys/mman.h>
9 i h1 }7 e: v* x0 X& a
#include <sys/types.h>
& A, b7 T9 O: D* P
#include <fcntl.h>
- x) e& y9 m& o3 D5 I f
! a6 s5 \. ]( M' T, `
#define SHAER_RAM_BASE_ADDR (0x80000000)
) h) A- k* p! n% W( l! I
. v. r) i- _3 |! W1 j, {- _
typedef struct
) n2 ^% j2 J( _$ D
{
" A1 c/ i+ n$ s/ p
unsigned int a;
; s4 _( F, S+ g4 J2 Z9 l
unsigned int b;
) v9 @0 k K! A* H8 h3 x
unsigned int packet_cout;
5 W, ~: {0 C- Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 o! [) |( a5 v0 _
" \6 R& J/ A/ w, j7 C W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% n- w L4 p7 }; ^3 X
unsigned int count_copy = 0;
; s2 ^$ j9 Q0 Z ^# |
& A/ A6 t, c6 _0 b# q% k, X; v
' I- O( d2 B; C0 R, }
int main()
/ f; w0 m3 o- C$ H1 G) w
{
& z. E( R/ ~5 i3 |; X2 |4 J, n b
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ z0 {5 P7 s' T4 o# b- C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. K4 {5 h+ Y+ j
+ A' V- u! G2 k/ M1 c/ L k$ U
while(1)
* ?* E( |9 S3 R) r$ I) N
{
: R0 U% s2 i. X: z: G
read_MSG_buffer(pshreRAM);
2 e' Q; W7 f# L; N7 f6 P
}
* _6 ^0 H3 Y- z& I. n# ]1 r
}
3 s5 Y5 n. ~- k7 U
3 g/ Y- g, ^- L4 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# o1 o( g \% ^
{
}; D2 Y/ B. Q: S
RX_MSG_PROTOCOL buf;
: A( |7 }; T* q5 O4 t2 W, u
" \1 g2 x u7 M; z3 w
buf.a = pshreRAM->a;
, D2 U- b& B: V& ^4 J
buf.b = pshreRAM->b;
, b7 M( s" `' A. \& g
buf.packet_cout = pshreRAM->packet_cout;
7 x" @6 v8 A' |# N# T; j
1 Z5 t( q2 @/ X. S5 o( f
if(buf.packet_cout != count_copy)
6 I7 n8 ^; m3 c# t. o! h
{
9 K& i" {/ F" N T: f
printf("a is %d\n", buf.a);
/ j+ n) a7 }5 W: y2 _
printf("b is %d\n", buf.b);
' g2 G% R- W: P4 }# `2 M
printf("count is %d\n", buf.packet_cout);
9 `6 F4 t7 C7 N$ U
count_copy = buf.packet_cout;
# t& m. `3 `* t" C) P! r0 X5 |& D
}
1 E2 e2 ^& {0 n( I/ C
else
5 b6 k& E1 q5 Y& T
{
3 A i9 | }' s3 G
printf("No effective message!");
( _5 C8 R% c/ T( b- [$ p
}
1 _: [- z0 d" o- F' ~! j
}
* e3 _* U. _4 \4 S; |! k
+ `; [; Q# k! ^9 j7 M
9 d1 Q* `- q) T/ B8 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; ?! J% o* h# E/ i8 O
使用下面代码,对内存使用了mmap函数后:
; B! |( {5 g6 h s' m
#include <stdio.h>
[) O! H) }2 g T6 Q, c
#include <unistd.h>
% |& w& E& w7 J9 @
#include <sys/mman.h>
% {: D" _& h& ~1 ?6 N" r
#include <sys/types.h>
7 |' H3 a6 K- l7 u6 `
#include <fcntl.h>
& w* K4 O( |& m2 z6 Z9 q
# M8 M( Y* `; \+ ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 K O9 e) b& l. \7 v
#define SHAER_RAM_SIZE (0x20000)
6 x3 a$ Z9 Z4 ]" j- s. V( Q: D
+ u8 ]0 M2 Z1 L) a4 z6 Z
typedef struct
, P! I. r F8 `8 Y w
{
8 Z! d& o, V$ Y6 G/ D
unsigned int a;
7 l! v+ ]- Z! V7 C# X! R" R
unsigned int b;
( D0 n+ W. b* \8 j3 [+ y: b
unsigned int packet_cout;
% V2 @5 j5 V$ P; h6 j# I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& e5 e5 b% f7 @ T
* K T) B7 { P+ b
void read_MSG_buffer(int *baseaddr);
1 H+ _4 T' d1 h1 ]3 o- E% H- U* q
unsigned int count_copy = 0;
) }' }( ^- ]6 D* K* l3 f: k
0 J2 _, N' U: j' e( z% L! C+ E
int main()
/ N. |- F+ u3 [. M) j4 I: J6 A
{
5 Q2 t* s; M% ~* ?
int fd;
7 q r$ K* @2 d
int *mem = NULL;
# w5 Z2 C) n% N( I( O$ {
^. p) {5 S. ]1 k
if((fd = open("/dev/mem", O_RDWR)) <0)
" q* F9 O; s4 N8 T$ l8 i" ~" I) Y
{
& Z, P/ s, s4 E& H9 p' z
perror("open error");
6 |; Q/ S! o# `
return -1;
% v) D" W$ e* N& M5 M7 g" J1 V
}
4 V% e5 Z8 H/ b5 j0 Z! z
- N$ f n9 E, B1 p4 q/ d2 `- U* X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- s _3 h9 ^# s% M' x! r, L1 o' V
# y* H% q# R; i$ O7 W% M/ g! `
while(1)
3 c6 Q: P+ b1 Y1 C# {; v* M
{
* W7 g! `7 @! w
read_MSG_buffer(mem);
+ Y& P$ z( R4 q0 W- p3 G' B
}
! m& n1 I1 [1 X: A6 Y5 r R
}
4 q2 J2 j+ y% O3 Z
: G( G& U8 T# @+ M! x4 j' K" s
void read_MSG_buffer(int *baseaddr)
, |% `' T- g# o
{
1 ~% n5 l/ K; g X# q' d
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 @. U: S8 I! S2 a* F c! Z `
- W5 ~! ]3 \: Z) H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ @2 ~7 v% ~; W/ _5 n! K8 P
( o" V v! H$ t4 z# h7 h
if(pshreRAM->packet_cout != count_copy)
5 m" G/ Z: P1 u
{
+ r1 v( R: O0 S2 P$ a1 i
printf("a is %d\n", pshreRAM->a);
' g- | |0 P' l3 {
printf("b is %d\n", pshreRAM->b);
2 @5 o/ @7 W5 k. D4 U) ^# d" j* _
printf("count is %d\n", pshreRAM->packet_cout);
, |$ ?1 `8 n9 z% N
count_copy = pshreRAM->packet_cout;
- y( Z& G! Q9 T4 |/ B/ b
}
9 V! f3 _6 Z* h! G7 ^
else
9 A4 s2 }. C5 f# R. f: d/ }3 l
{
" B# U7 s7 [9 ?3 |- x
printf("No effective message!\n");
7 ]0 i- j8 O7 V+ ~4 G) n- I0 g
}
~4 W; \3 r0 f* _
}
& M. u* ]( U3 Q) \1 o$ o. f0 ]) s
7 W0 ~' @- z% T1 g7 _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. }$ f6 |7 S! u5 E1 E
8 W$ j4 V3 N4 ~: E. N
9 d7 `8 ?: b/ h; [$ m$ }, {
" z( i# _5 |: d8 Q0 s) e( J
! `# R8 J. |; i% F6 V: U: Y: M
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4