嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# H/ G1 i6 K2 y. m+ \: S/ ^
0 S8 \0 }3 ^5 ^! }+ J# @* L. b, q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 \' n5 G3 C4 g) i/ P
#include <unistd.h>
9 ^0 _# t) O7 ` \- H0 ] I
#include <sys/mman.h>
# s) J' q1 \" T, S
#include <sys/types.h>
) s7 l d' D- b Y. X# f. t
#include <fcntl.h>
9 m' l, q8 b* L4 Y$ G0 t2 k
" r9 i6 ~- J+ |8 {1 w' y0 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
: m# t' e0 H ^- I
9 b _/ J: d2 c
typedef struct
6 a4 z9 h0 {9 R% _
{
/ ?' [; {0 y/ V) X" B6 {
unsigned int a;
4 R. r _; l% H
unsigned int b;
; c' v, g' c# J" r }, ^ z
unsigned int packet_cout;
0 K! }9 ?8 [* q4 [- j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ N% \: Q1 J7 d4 u- A5 Y' M# x
0 r/ `5 U7 N' B& q; A O% W! B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ b# z" ~1 `# X6 b0 F' e# N
unsigned int count_copy = 0;
6 p. r! @) ~2 H
9 [) |3 I1 }+ f6 y# i2 K
0 n, F% d9 k- Y+ V! I) V" ?8 V
int main()
! F7 ~+ S- J* q8 s' _8 J3 _4 X
{
( ]7 [% p7 F+ \* X
pRX_MSG_PROTOCOL pshreRAM = NULL;
: g- H. C+ H5 s8 r% G c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ P: a8 X: B; \3 Q
4 I! S' Q$ w- b
while(1)
$ D7 O* ?3 W' x5 M: W$ t% X
{
- x" ~ P U) q9 r
read_MSG_buffer(pshreRAM);
X/ Y2 B2 g8 S
}
* v- L3 H h5 q% t* v c# t
}
* ?+ r0 i: X, {& w3 t. n6 x
' O k% P- P2 O; k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' M; O8 I2 s7 I% R
{
' _' t. t5 k. A$ S9 \. [
RX_MSG_PROTOCOL buf;
( i7 h' ?1 }* O; t
$ n0 s1 U* ~& }$ _
buf.a = pshreRAM->a;
: t6 O) p& m8 i% a+ F
buf.b = pshreRAM->b;
! o" l8 D; E' ^+ `# M
buf.packet_cout = pshreRAM->packet_cout;
* v7 O9 B9 [1 O$ h
% A1 b7 c# p2 a l; M$ f2 p
if(buf.packet_cout != count_copy)
' E7 O. G$ Y) ]) v* Q4 B# r# w
{
. c$ x' ?% L) r9 E L( q8 _
printf("a is %d\n", buf.a);
7 [. o0 S# O! i
printf("b is %d\n", buf.b);
& |" y' v3 G- ? a2 A
printf("count is %d\n", buf.packet_cout);
2 D7 t4 w) ~3 t3 D0 d/ S
count_copy = buf.packet_cout;
6 S3 v. v( U+ G. N6 Z0 l
}
2 W' k. T& c5 T c, W: W
else
/ V* M) A4 F' `# r: ?& b$ z8 Z
{
# B) b, D/ b f4 @7 y& k- t9 s
printf("No effective message!");
& p% [% x# O9 \8 v! b
}
- G$ m t# _. T2 n
}
! x: ? J4 M; n' {
$ A5 ^3 P- G5 n y; {* }
( W+ M. W6 U" m4 F1 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ r" F+ q# ~4 Y& f' b5 n
使用下面代码,对内存使用了mmap函数后:
- k/ s* Z9 _! E6 e9 h
#include <stdio.h>
) l7 _/ o# [8 u5 f7 U
#include <unistd.h>
1 C/ J* u# S* ^1 X# n8 w
#include <sys/mman.h>
V6 e# F- Y! d# w5 i% y! y
#include <sys/types.h>
* r3 g+ ^1 C9 [ B% R1 I# Z* N0 R
#include <fcntl.h>
) |9 ]5 a1 N7 ^% q, J
- j3 F4 w" z5 t7 [
#define SHAER_RAM_BASE_ADDR (0x80000000)
, R d. G# \3 l9 e( Q) j9 O- W
#define SHAER_RAM_SIZE (0x20000)
. G$ Q! e' A, U
8 G1 Q: D9 w$ n& H0 U8 d
typedef struct
! i3 d8 P5 Z" j& x
{
5 d5 y9 J' n! V8 q/ K: r7 R% A# S
unsigned int a;
$ l$ U; v- O; ]; b% Y7 [0 k
unsigned int b;
% U2 s& n8 F& c$ Q
unsigned int packet_cout;
/ V; B# `. y K/ t% Z+ }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ?' D' Y( |6 P' \& Z: ?6 |" l6 P
% Z6 A. B, w W% ?$ V/ d
void read_MSG_buffer(int *baseaddr);
; h- U/ e1 E4 D9 ^
unsigned int count_copy = 0;
, i3 S. s& J5 |+ ^
, J* k" S/ G* r0 l, s G
int main()
' w+ K+ \, M2 ^* t( }5 H* {3 w/ L a
{
- I6 \' {! _; b; ~; W a
int fd;
* I9 h& g5 x" j: r+ m
int *mem = NULL;
7 L8 K! g, | Z. f6 o
& A& g# I: I& |9 o G
if((fd = open("/dev/mem", O_RDWR)) <0)
! t* a ?: W5 b( k
{
1 \1 ]; ^, v/ [ I
perror("open error");
+ y1 g4 H. i& p1 t2 B! O4 M4 o8 I
return -1;
: d; L" ~# v, V4 q2 F
}
% \& d- B6 ]; p( B, u/ `
( h# Z9 T; J( d( M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! z! j0 t/ ?5 G, Z( h
& E l- H6 y: I: a) f
while(1)
# k" d+ i7 Y8 }3 e
{
# O5 [1 x8 _( @0 K9 C* P
read_MSG_buffer(mem);
) \4 S1 b+ M1 u( f
}
4 i+ Z) n2 B5 {4 {2 \" r1 n/ ^
}
; ? z; o) x: ~) [$ `
: a/ R0 S8 e1 m6 T9 `2 `
void read_MSG_buffer(int *baseaddr)
+ Y6 @0 R+ _3 i& ]
{
! k! E j5 u$ x' v! e( b' P
pRX_MSG_PROTOCOL pshreRAM = NULL;
" k6 R' O* {/ g s$ p) ]7 f
: J4 Q( C: t. g6 l: R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 \! [& S S) Y# {: G0 y) N
) B2 G0 m8 O) C# e
if(pshreRAM->packet_cout != count_copy)
! }: J6 M; D+ n5 J) Y
{
8 w( z; n. e; f7 b% u2 I. t
printf("a is %d\n", pshreRAM->a);
# N6 A$ K+ p$ [" o* u' d
printf("b is %d\n", pshreRAM->b);
3 R, A* P9 m; U* D* Z* j
printf("count is %d\n", pshreRAM->packet_cout);
D; L8 [! k" \, ~5 b) V
count_copy = pshreRAM->packet_cout;
; Z% d) l6 v1 n" G
}
2 l3 L1 W8 P9 L/ f' F+ B% A4 }1 P4 B/ l
else
E+ Z; Y, n! L. Z! N2 o* T
{
1 ^1 P/ V- @9 W$ n( S s5 y' Z, _
printf("No effective message!\n");
4 W, T+ ^* n( e+ j/ b+ e
}
7 K2 `6 B% y, {
}
! h. d& y; E8 Z2 O* r7 o8 ~
( O' ]3 ?- S2 Y* j' v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 z' x( R( o" l. k# `: p9 C
- a8 J" g2 y& G5 V
0 ]- d; }. A; y3 K. ]% T' S8 c
7 `1 ^. y. W% s- n+ u* c0 D
e5 ]( m6 L9 w
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4