嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 `! t: T1 b; \4 v" o8 y
: \; S5 A5 v9 e2 D: X! f' Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 O/ m/ p+ @* S* j' @
#include <unistd.h>
( k( }1 _* n) `& J% C
#include <sys/mman.h>
4 o( X/ c' `: j
#include <sys/types.h>
! I% w( M9 T- |6 D$ A
#include <fcntl.h>
r+ ^& f% n8 f i$ g- ^* n
+ a7 n1 G9 }8 V* y% b6 V/ C
#define SHAER_RAM_BASE_ADDR (0x80000000)
" u' D2 ?; R2 ~ O5 C& J3 O, I w
+ {" p5 d" k/ s% J% O8 v
typedef struct
5 g, F. A5 W6 N% D+ p L( O' U+ f, G
{
! O [7 b9 J+ ^
unsigned int a;
+ e. P- S6 m z9 E1 V: B8 K7 G
unsigned int b;
, S8 F' j( ]4 S3 s
unsigned int packet_cout;
: m7 g3 f/ b% j8 M! L1 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% d- M! r5 x8 M' N
3 s) G) d+ d9 e7 ?) h9 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! S6 L: h5 u6 ~+ H* f/ r
unsigned int count_copy = 0;
2 S& `2 w! q0 O6 k( e* z
& K, Y$ I( d2 ^& f1 G
9 \$ [. h5 E9 h! ]
int main()
+ G! K5 S# l- i2 B( X
{
d3 l& _3 \7 X6 X8 n9 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
* \* X% I( q7 v9 J, x7 P% p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ D" p. w/ ^) U; b3 @ ?
/ k3 `& i# A- o8 b4 }. k
while(1)
: l' s5 @4 G& I
{
8 g! C$ }3 |* T; J: N; I, z
read_MSG_buffer(pshreRAM);
$ U7 J& v: ~- e, W/ h4 g
}
9 e' r/ m- [$ G( w
}
) @& m! x5 o% F1 M) [8 U& p
2 ?3 ~& G1 Z3 o! O1 q2 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 ~" L; l& q- Q5 f
{
: y) ?4 u2 Y- e9 S [
RX_MSG_PROTOCOL buf;
7 |3 |7 f- C/ X& S; w, {
- p+ B* j% N# K( l. F: p9 z! g) |+ L
buf.a = pshreRAM->a;
, f% [* W* v" q0 Z& ?* i3 p& G. ~
buf.b = pshreRAM->b;
. k) l' o" j4 x) G) {
buf.packet_cout = pshreRAM->packet_cout;
' G$ l* G. z# z5 w. f& k. e' R
$ z- ]5 W9 N n c! `5 y
if(buf.packet_cout != count_copy)
+ |& ^0 e. p6 T2 |$ W6 U/ ~
{
4 J/ v, w% m& g
printf("a is %d\n", buf.a);
& w9 a0 o5 L) Z, e! M
printf("b is %d\n", buf.b);
. K8 X7 k/ R- x5 B: s/ C: \' D' i
printf("count is %d\n", buf.packet_cout);
/ Z& {: [+ @' Z* Q
count_copy = buf.packet_cout;
1 x. X% X; |: G- q" r1 u# d
}
7 T; x, \+ A2 a' B- Z
else
0 J# n: ?; @7 X6 ~2 \+ C: ~
{
C. B3 h& F) Q: E3 T. |. `
printf("No effective message!");
4 k" l: Z0 w+ q6 ?* ] }7 ~
}
8 W; z$ p+ L) c* q/ I$ t7 C, f$ R( m
}
: J" U8 E9 A% _/ q4 a
) c& R( N; }0 \; n* [
" f; ~! w* \ T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 V' a1 Z& ~& S& h
使用下面代码,对内存使用了mmap函数后:
7 C3 T8 f9 w: w) Q
#include <stdio.h>
! g' F. r* C$ R
#include <unistd.h>
2 c# c/ ^; n! u- m4 H/ Q
#include <sys/mman.h>
3 c0 ^# s6 H4 F/ T
#include <sys/types.h>
5 T' ~. v- B! s/ c5 A
#include <fcntl.h>
- P& s" R8 N& O8 G5 {1 A: t
$ a" e- P: K% y' ]. \, H
#define SHAER_RAM_BASE_ADDR (0x80000000)
! E1 \, D; j7 ]9 ]% n
#define SHAER_RAM_SIZE (0x20000)
& k4 @; q9 c$ l7 l7 @4 ]
' A# ?* B5 |3 K+ p4 t- n0 C8 e
typedef struct
% R# M$ }/ o+ I, ?! S A3 F
{
& Q$ h4 W. p0 M4 o- k9 _
unsigned int a;
2 O. X1 h. n2 s# s$ ?
unsigned int b;
1 M- @& g2 M' n% S' r
unsigned int packet_cout;
+ }" J6 \# N. r# n% g8 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 {7 @0 x/ ^7 u9 t; t9 ]% p
: o. V/ M0 Z* h* ]8 ]- w
void read_MSG_buffer(int *baseaddr);
0 E4 y# }. S" A. k- `6 v r
unsigned int count_copy = 0;
a+ _8 l- m: E1 ^7 m% b' X
1 ~2 Z8 h. y2 {. e1 R
int main()
! N4 X6 ?( q2 e& k3 O
{
( e6 s1 k9 k( O' S
int fd;
' y# @* V9 z* p+ f- l
int *mem = NULL;
5 Q: [ V+ a% L& ?0 ]
* d7 P- t7 O: r) a7 a) J* P
if((fd = open("/dev/mem", O_RDWR)) <0)
' D! S w# } k# x
{
- ~- K# \& g7 d4 X" u! Y* L
perror("open error");
4 R+ r' _1 e5 ?+ d$ I- |" S* `( a
return -1;
+ J' ~# M1 s1 u7 {
}
) X* G4 w9 {% |( Z/ ^$ } C; |
2 y9 }) r. H4 B4 i2 B" Y( g1 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# ~; \! S0 p' N' C
: Q: Q) w/ A# _5 Z0 v- T) b4 r, P
while(1)
; q$ [' U5 \# N- `; l. k
{
$ N& ~6 {" m T6 m ~
read_MSG_buffer(mem);
9 A0 @9 D% E: U) x
}
0 Q( B# m' G0 Z( [" S/ h- R
}
, n! d* j9 y2 Q- O/ ^3 }5 @# e
' _% n9 s! F+ ?
void read_MSG_buffer(int *baseaddr)
; \; ~ w! Z: b0 ~
{
; ?+ c9 m8 w4 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 L1 s1 g3 g0 e/ ]* P
) X% I+ i& e& I1 N* t" P2 |/ b5 `) u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, o1 c# \5 z# N/ J8 D# i
0 e/ p% l; F1 B) |1 Q
if(pshreRAM->packet_cout != count_copy)
, t ^# K1 S! o# _
{
/ j' d9 ? {' Z, ^
printf("a is %d\n", pshreRAM->a);
, S5 D6 M5 v% ]8 s- @
printf("b is %d\n", pshreRAM->b);
" @4 r/ F1 P& l: _; q% J
printf("count is %d\n", pshreRAM->packet_cout);
M: R8 }4 g" F2 g/ z8 ], M% n
count_copy = pshreRAM->packet_cout;
$ ?% I. y, X: N' J4 U O
}
( F% t" z2 A4 t: Q
else
" L8 t0 f. j* N( O* m
{
% v9 w) O0 W7 ?6 a7 k
printf("No effective message!\n");
; ~5 L' @6 K6 B M1 p d5 @
}
- k. E) L$ E$ T3 D$ m
}
0 t9 a9 ^6 D5 _4 V
/ Z' b& ^( Z0 `% b3 e& d3 o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 Y( |3 @7 @) ^8 H4 `7 `
, |, ^7 V, I9 f6 ^
2 u, c% `! |' _4 B
1 T% Q8 G) U$ ~0 m& f! m
, W" H! f6 @0 i5 A! u1 S# p
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4