嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' p. k2 @% e/ Y4 c
, @2 {& x! v( z6 x$ ~' {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 h- ]/ {* P. L0 [ K
#include <unistd.h>
! b0 u; [7 B- K; J0 {8 m
#include <sys/mman.h>
/ v$ S) F7 G* u$ n
#include <sys/types.h>
9 T' @+ [4 X. N$ z3 ^# H
#include <fcntl.h>
/ T6 x8 `2 G! w! n9 d
' G+ D x/ Z7 W- a4 Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 E1 V! B# ]& q1 C
( h2 |. H6 p# B
typedef struct
t( [ B' N! A; U
{
6 ?- W, e) p0 Y- H+ E- I9 v, G
unsigned int a;
4 I* n) V7 T1 a* R3 } f" ~ E6 z
unsigned int b;
( K& i/ }4 a5 t# d7 T; |
unsigned int packet_cout;
0 t( V1 F0 }% d# b; t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! U: H0 x" k$ \% _4 I: H
& m, _) ]+ s; P J$ G! o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% i+ A4 W! f, c2 M" o7 E$ ]
unsigned int count_copy = 0;
: u5 R1 n3 f' d) y: Q! s
; V3 l; n# `' M( ^6 {' E, E
! z) t5 S" ^: Z; e- N0 \% A
int main()
+ H* d9 S- X; q( a$ I/ P
{
6 c8 K& q( x. o5 `
pRX_MSG_PROTOCOL pshreRAM = NULL;
: b/ D/ ~( g8 n$ S+ |+ |0 I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) Q5 N; K0 L* H
. W: u; ^0 Q$ Z4 n
while(1)
) u* Q1 b7 g" I- @
{
$ W! Y4 C2 x1 e9 _( N# y
read_MSG_buffer(pshreRAM);
- c7 V- A% d0 X" Y ~
}
& b, U q1 V8 ]3 B- E5 T
}
8 j# R$ o6 e. k; ?" M
0 T3 L9 d5 z5 A" V& x/ l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 j" |6 o; R4 o) S& y
{
/ L0 ?5 G! V* \ m. N; @
RX_MSG_PROTOCOL buf;
% z% [- F& _: b8 }
6 C5 q( r; v- ~8 e8 q
buf.a = pshreRAM->a;
. A+ {# o4 O* w9 \3 U
buf.b = pshreRAM->b;
+ }* F# P7 m: q- c+ {5 u% N
buf.packet_cout = pshreRAM->packet_cout;
, m5 U. l* K1 h- G" G
0 s. M, h7 C$ b0 x
if(buf.packet_cout != count_copy)
% U* k- [# R' I/ b! o: w7 G
{
, \$ Y$ T( s0 ~; \5 g
printf("a is %d\n", buf.a);
7 D# t/ i5 }, y' f; ?
printf("b is %d\n", buf.b);
# b$ X# j* V% Z$ E) r; v" q2 }: v
printf("count is %d\n", buf.packet_cout);
4 t6 G3 _" r3 A4 Z- `$ }2 I5 d
count_copy = buf.packet_cout;
! S5 @- ^4 p+ m5 {
}
) w4 P0 D& z( Z0 M
else
6 a8 C7 b2 O' m z! e* G g
{
2 }9 h! e- {' K4 H4 {; }
printf("No effective message!");
$ i; f" U: j* x: I- \1 \9 }. R
}
1 G T! C' ~& Z5 L, w8 k+ q
}
9 L! ^' L' z" z* q$ u/ v) @
* V' A0 J- A, A; M) N) d
" y: Q1 q. u. m' ^( M- H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. l' z& D) `2 j# T: \0 y
使用下面代码,对内存使用了mmap函数后:
% b2 K3 {% A, s
#include <stdio.h>
3 ]. |" E( X$ u4 {% B
#include <unistd.h>
: t" r6 X$ k. [" m4 b& T' _! ~+ G& A
#include <sys/mman.h>
; @- @5 N, w0 }2 L" q5 B
#include <sys/types.h>
8 o, O" Q M0 X1 F7 ~
#include <fcntl.h>
3 Q1 [6 v* P8 }4 ^) Y3 y) w
" D/ f0 ?5 E0 I: R) a |% ?9 p
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ q* h7 \, H' u9 q& X
#define SHAER_RAM_SIZE (0x20000)
4 `( h; S6 h- x) }$ I+ z9 K
4 b; [4 m( y# H' `% {: J
typedef struct
) ]0 V8 I' x/ E/ ]: \$ Q" S6 g
{
2 _: S; V* p @, ]
unsigned int a;
/ J; B6 x2 ?/ O& v, E
unsigned int b;
$ s6 e( X$ M* O& Z7 s% M
unsigned int packet_cout;
7 d, C9 b; S) ? L! a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ Q' m( m+ I" J3 }4 {9 T* E$ N
) K8 R: N* c- x7 }: C3 b% r
void read_MSG_buffer(int *baseaddr);
$ p0 ]# `. f- @1 R0 d, q
unsigned int count_copy = 0;
& r% P8 h6 e4 M1 d- ]0 \
; @5 G$ _% ~/ k/ P; u! d2 c
int main()
. T8 K+ G, k9 N# X! t
{
5 u1 v1 Q! M) _( ~8 J! w
int fd;
" T3 X$ y5 K/ B6 J
int *mem = NULL;
& t: j0 r; a* [) |6 K
7 J9 H% D8 f& }; R v6 V
if((fd = open("/dev/mem", O_RDWR)) <0)
! V* X ~- Q: y, ]9 e
{
0 U2 ]8 I7 w' b
perror("open error");
- C, d, t: Q" W# Q5 W7 b: x: h
return -1;
: O! T) `/ B/ X5 q5 k4 N7 k
}
! U9 m: p8 x! F) k1 u. x! O5 X f
; y3 \2 m4 @3 `" Z& g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, e% F/ |: D n! J# C) V
7 U9 J' G- c+ X$ h% ^+ s8 a
while(1)
. H% k) b O) ]9 o' b
{
. U/ a0 v% F! l) g
read_MSG_buffer(mem);
3 Q3 S8 `9 [/ u- V. o S
}
7 R7 g2 P2 }3 x5 ]+ m
}
7 w% [6 y& h) J6 L4 L% u
$ V7 h: E7 Z/ {8 _; f7 t
void read_MSG_buffer(int *baseaddr)
* E% V; n$ F4 z M
{
7 I1 v/ T0 n* `
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 B$ w6 Z) f! S; S" e% m- d* s
% _1 d) m/ I% t, D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ [: n: e# o, B3 u3 t0 J
, @, l% f9 I5 j' L; O+ D
if(pshreRAM->packet_cout != count_copy)
+ q# E* ~+ i+ x% _, o, H
{
- }8 J9 \ a1 ?9 Q
printf("a is %d\n", pshreRAM->a);
( ~: E) q+ ]% k4 T C- x# y
printf("b is %d\n", pshreRAM->b);
, [' [4 Q) D* [! y
printf("count is %d\n", pshreRAM->packet_cout);
2 e, p. R' d: I( R7 r
count_copy = pshreRAM->packet_cout;
2 u( m: |+ _+ u% _8 Y
}
+ b: m9 `, E* {1 N
else
# b6 z: |8 @' S% Z* \5 B; c
{
* J' _7 y* x% u( z
printf("No effective message!\n");
0 n8 Y! @* V6 m8 ~: B# P: j
}
+ R/ ]3 t! s: R, Q
}
8 g" M6 N/ S$ n
1 T2 X# n" F7 z) s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 u/ y6 b7 X$ s$ D4 c
: _5 r$ a. a% `6 k5 L
# ~; b3 v2 t4 N% l& x
$ S* Z# \0 f+ I' ~& ~+ o3 ]
2 X( ^, f+ U) e1 N
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4