嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: s2 u' b2 K, G0 a1 X" O: {; k
% k1 i2 {% D1 w8 U: E1 a2 w: a* v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: v9 D4 e4 }7 z3 w/ f0 U
#include <unistd.h>
3 V! o# J' N W
#include <sys/mman.h>
1 |, G* S5 x: C) l3 @( B
#include <sys/types.h>
/ B/ i- W; E! M. z2 Y1 N* Q% I' {% v
#include <fcntl.h>
( q* M9 D- k4 p$ B
* h8 F5 n& o) B/ n! D* Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 V+ a' ^ c' `4 w, [
( \- u/ S! O/ x3 e
typedef struct
0 L) f- ]0 p/ @2 l5 M. h& p4 b6 E3 A
{
5 ^$ M P0 X' \4 W: g2 f' m
unsigned int a;
. G6 k! M1 v4 m! z
unsigned int b;
& H% q$ x1 a& a a$ t
unsigned int packet_cout;
( c3 H1 ]; e m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. l( M5 F# F; T
+ W! W9 j2 y/ H; [- _; P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% G# G; q2 b6 r d1 c
unsigned int count_copy = 0;
0 y: B2 e2 d& {2 T, Q
) h0 N% V8 X" {$ A6 x2 l
3 o! m) w3 Z0 G' u0 X6 x u
int main()
8 P; v/ o/ ?1 S0 m) l2 x7 ?
{
! Q5 H5 Y8 R; ]4 F
pRX_MSG_PROTOCOL pshreRAM = NULL;
. t& {6 m, a8 u# e+ C. V2 y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ y' T8 f6 O2 h
, [7 H( r& J" H9 A1 @
while(1)
+ ^. a( P' N" [9 N8 I
{
: t- l* n8 {1 w/ L4 e
read_MSG_buffer(pshreRAM);
( x- d$ z! k) b* A+ V- X
}
8 c2 ?. ?2 Z! d
}
/ `7 f$ p! `4 z) V; T
0 L6 T; q9 L( I+ Z% i |5 w# R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ b8 k9 S5 `) Z0 h
{
# F" T# C. c! u# P* a( x% ?9 O3 Y; t
RX_MSG_PROTOCOL buf;
3 h: O% i4 \: f C1 t
) l8 A/ l7 a; Z5 J, @- _, Y, w
buf.a = pshreRAM->a;
8 U! x+ X7 |4 |4 U: j G
buf.b = pshreRAM->b;
1 J9 E( W) z' V7 c
buf.packet_cout = pshreRAM->packet_cout;
* U4 C4 f1 k/ h* z0 {9 U
( Q) |3 M( {; f9 x% k. E
if(buf.packet_cout != count_copy)
9 |* i5 ^+ k( G2 t% N' ~; _
{
+ n8 u( u+ b% p' D: N6 n/ n
printf("a is %d\n", buf.a);
% B. c, ]6 @. }# ~
printf("b is %d\n", buf.b);
1 V. m7 k9 f' c/ ^
printf("count is %d\n", buf.packet_cout);
4 Y/ ^) I g' p( Q- Y. N
count_copy = buf.packet_cout;
( m7 o7 A! A6 ~2 _2 n" U
}
D/ S& [# I' V$ C
else
4 O9 y2 p; ~, U. r. m
{
) j/ ~: A6 U) u h$ ~- a1 S
printf("No effective message!");
8 O" Z6 N' F0 g$ z! P
}
' k; t; v8 U2 k
}
+ U4 ~ [1 @' I
: i0 Y- \! O3 A# e6 D4 Z9 x( U
# v" |% n5 m* a8 @0 Z, d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 I! q8 y, l# r. j9 }7 x. X( h- y
使用下面代码,对内存使用了mmap函数后:
) W! b! r! {4 L/ p" z" J
#include <stdio.h>
& \. |) u* H5 X0 x: [4 d! W
#include <unistd.h>
2 R0 D4 c, x" c4 `( y
#include <sys/mman.h>
# S5 _7 }( W& ?3 a) a
#include <sys/types.h>
* L" t; F7 T# M Y
#include <fcntl.h>
. O( n3 \( p, e% @
' s+ S$ b- \$ i
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ _" B& t# }* ]$ h8 K) c
#define SHAER_RAM_SIZE (0x20000)
% z; I, N' P* w" m0 p- v7 F0 T* Y
5 a/ h. `/ ?' b% e" ~3 V, O' ?
typedef struct
' W$ m, |# v0 x. f4 P
{
& P4 b; c u+ [+ M
unsigned int a;
$ F! Q8 @. d: k, ?- {9 Y# C
unsigned int b;
; p" ^; T- p; [4 \* b; a
unsigned int packet_cout;
w# o: Q3 \2 Q( ~+ [) a1 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, J4 j3 {- G( K- y
~/ M6 s% R! y
void read_MSG_buffer(int *baseaddr);
2 Z5 J" G; G) a
unsigned int count_copy = 0;
. j# f$ j3 L7 C# g- ^# |
8 L7 O# H% ?/ k$ R- Y& G
int main()
4 i/ e% \, ~$ k4 @( \; H3 y
{
8 x# }& L2 `: y$ J' g/ s7 I
int fd;
) l4 Y! ]0 q$ }5 w ]
int *mem = NULL;
8 n1 Y2 |! l6 Q+ I
& Q4 _* p7 L$ F. @0 n7 o
if((fd = open("/dev/mem", O_RDWR)) <0)
/ b6 \- t, P: W+ p6 `: l* |
{
% X& t! s+ |7 f2 w7 }) Y) h9 C
perror("open error");
" N, Q% ]' X |! {6 z: N8 z# k
return -1;
3 c& b( r1 |% \* l; w
}
. l3 b! {9 z7 O
9 i! ?$ v% e1 Y$ \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 x7 y: l4 M9 ?- X( M
! C3 Z* s) w" D4 d
while(1)
& a2 [1 W% c, c# O' y h! k
{
% u8 m% D9 ^4 S8 H& U
read_MSG_buffer(mem);
) P4 u+ h/ ]8 T; k U7 N6 o
}
( r3 o$ \( w5 k* e4 C1 n% b
}
! U/ C# T8 r7 L9 J$ u
: ]2 W. p9 ?! o" c
void read_MSG_buffer(int *baseaddr)
9 k+ G' m# l$ A, T3 q" ~
{
h9 b# F5 Z+ n+ w
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 F. Z; Z2 P+ V f2 v
2 ?7 g z3 D- x% |7 O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. ]$ _8 s; K: a
9 L2 w2 y, r# p' L
if(pshreRAM->packet_cout != count_copy)
- y. w. [! ~3 I g; Q) s
{
8 t4 M3 k. ]" E3 z0 x( s
printf("a is %d\n", pshreRAM->a);
0 M/ N( o% W0 N0 k9 U
printf("b is %d\n", pshreRAM->b);
5 o' ^' C8 b) y _9 P
printf("count is %d\n", pshreRAM->packet_cout);
5 R! T9 m* I2 H) a* d) ]; p$ j5 u
count_copy = pshreRAM->packet_cout;
. J) R" `7 f' I, `
}
6 {4 [$ Y" ^2 A/ i5 k2 q
else
- A, ]/ \2 ^" S3 V" e, j
{
, q V9 \1 n& R" x8 d
printf("No effective message!\n");
. O% m* {1 @; ~: a
}
$ [$ ^) s& m& q4 }' g
}
+ h3 {" ]9 ^( k& ~9 Q {
: y& @. u, \6 t& n% _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- H5 S( }) R* L9 F7 j" b" q3 }% N X
" n( P+ p/ H) o
/ a3 [! o ~. r% Q; w
8 r; u- j+ Z0 k
& Q9 @; @0 o/ Q+ q9 I& k" r- s9 f- U
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4