嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, K. d0 \, h. n$ e0 i
+ _7 _1 ]$ y" w" ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ T) \% D) W+ w5 O7 A7 ^: G! t
#include <unistd.h>
' _3 t7 p- j1 p' y0 \1 B$ E7 D9 b
#include <sys/mman.h>
9 f5 s3 m) j) |( \. R: d
#include <sys/types.h>
+ O' I8 [, `6 W9 `& s
#include <fcntl.h>
0 Y( ^% Y# f) _! {7 c
, ?9 f0 r7 [6 `5 X
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 ?7 Q: z/ a0 {
6 O, y( ~0 H2 n
typedef struct
2 X$ x9 o# }, i6 j* T
{
* g0 p" P+ s& n
unsigned int a;
* i! N, P: P, M
unsigned int b;
/ z T, w, m$ L
unsigned int packet_cout;
" u0 f+ R! _6 W+ E7 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e6 Y" V7 ^# h+ F8 ^) x
8 c5 H1 O) Z+ E" t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ t1 k; X+ W B7 n( _, @3 n
unsigned int count_copy = 0;
" h. i) r, X% f
% B( x$ g+ J8 D
0 `5 B( l# i: i! Z2 H3 M
int main()
) p% X: f5 e9 H9 t0 B7 [( a
{
! \) d" w- j2 p- t0 s5 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
! c: h; Y4 d! `1 [6 z3 b* O" ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ R2 a: s: @. j1 {/ c9 Q; _
, }* F; y1 U8 r/ }
while(1)
5 Q8 {% h" c5 u6 c1 c
{
6 S6 D1 R' l$ V7 X
read_MSG_buffer(pshreRAM);
. {" U3 [. z3 C" B# T5 R: L
}
6 c3 P+ L' i8 @8 A
}
3 @1 u+ y2 r3 i/ Q8 F$ ^3 R
: o, K2 `" n! P& z' t' U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 {8 n0 ?/ m& M8 L; I
{
' R$ ~9 t# I) {
RX_MSG_PROTOCOL buf;
# ?% c& M+ Y! |) \/ ]3 a* p
) v; k: D D4 i* E: O
buf.a = pshreRAM->a;
; _) E; X3 e" a" C" m# ^. K
buf.b = pshreRAM->b;
% W; h3 b* ]; P& C1 l/ s
buf.packet_cout = pshreRAM->packet_cout;
$ I; d5 W6 L0 a
3 A# H d2 _5 _ ?; y# \6 S" ]2 r g
if(buf.packet_cout != count_copy)
. j) v# y x0 ?5 C
{
0 V# J) f2 E) I, J% Q/ m
printf("a is %d\n", buf.a);
) _- t( ?" i2 Y9 B3 U
printf("b is %d\n", buf.b);
4 x+ ^1 K! t, J( }
printf("count is %d\n", buf.packet_cout);
0 T9 V c9 Q1 r' ~/ G- C
count_copy = buf.packet_cout;
( a1 \5 X |# f- ~) T
}
( u* O% f& n$ Z, V5 ^
else
3 f' c6 c4 e6 K8 B
{
6 Q5 y2 ^6 g, |8 j) n# v
printf("No effective message!");
2 q4 Y: @- @. ?9 [. S" G/ K
}
$ }! g" l# V5 `- @( D9 D, C4 v$ b; D
}
$ y; `8 w7 o7 F% H
! x# D6 {7 f% U, n
2 P3 ^# O+ n% H! r$ F( L8 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 p d: P! c6 f* c
使用下面代码,对内存使用了mmap函数后:
' q8 j, D6 v( G. h3 P/ |$ V
#include <stdio.h>
% @7 d0 @9 [4 C/ o5 P
#include <unistd.h>
8 s. ]6 `5 }! [: P1 j+ _9 L
#include <sys/mman.h>
& E8 n) a4 }1 p( i7 D5 [
#include <sys/types.h>
- d( ]0 k* y ^8 g" \4 M
#include <fcntl.h>
0 P) d; D6 Q, D6 j+ E5 x
% q7 F7 t" X2 a- X0 C& b! @8 }
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 n! v/ r( R9 y; Y
#define SHAER_RAM_SIZE (0x20000)
7 v1 I- J6 M; f* W! t7 N
) x( y# A" Z8 j% J5 l
typedef struct
$ ?9 E; h& b0 y2 m
{
% l& U1 j* `+ j3 H
unsigned int a;
" P. @5 }8 j( `2 `' p6 J
unsigned int b;
! _+ g" q, O3 V# l% w. q$ N0 U
unsigned int packet_cout;
; L; j3 {& u% N+ G7 L/ |3 H6 N2 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" X5 _' R; q4 J w6 X4 c6 g
8 T% I) ~5 ?( K
void read_MSG_buffer(int *baseaddr);
S' |6 ?1 X; B/ o7 X
unsigned int count_copy = 0;
' h; N) h7 N# E4 ^" k
+ m, h) l2 i) s( K
int main()
/ n! v( B7 ]$ \! z8 H, N! U
{
, \9 ~# F8 c5 r) Y7 ^9 G
int fd;
0 z9 k, G# w y
int *mem = NULL;
% v" N, [! @, N5 r
) R" w# W& p* {' g, {
if((fd = open("/dev/mem", O_RDWR)) <0)
/ N8 `! A' f5 i$ z3 P* o( s' C
{
0 `5 b# f" r9 Z. o+ a8 |$ B6 u
perror("open error");
" j+ I. u4 B: Y% g' b
return -1;
8 q5 e2 \& Q4 }9 r; L- n
}
1 L. j' ?; R& |0 p
; s W; M( [$ M& J: [: D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) L- |1 x+ @3 m8 E5 W
: V2 q' `5 t4 G- I/ N K( W3 R
while(1)
( P: Y9 D, l5 k4 W
{
0 Q+ U6 ]6 x4 e/ E' j" t
read_MSG_buffer(mem);
. s# q7 u0 z! E
}
# x8 p7 n7 k' n# k G% H$ X& M
}
, E0 U$ g! g7 A& T# e- z" {
* @6 z- @9 i9 i) s( V/ h
void read_MSG_buffer(int *baseaddr)
7 L7 Q+ H: t$ w- \
{
6 I3 }9 u# v. \/ ^& F' S
pRX_MSG_PROTOCOL pshreRAM = NULL;
, Z) V! ?( o; O* W* P% k( A
! Y# d0 s& n$ h$ ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! }. a6 Z/ Z, p! g% Y4 j
' v. P2 |: h* o2 S/ z! g5 T' I
if(pshreRAM->packet_cout != count_copy)
% U4 e- d5 z4 Y2 L' F
{
4 h/ g2 ~- q$ q9 v+ I7 j: c' w
printf("a is %d\n", pshreRAM->a);
9 X: Y j- D9 x" [, T1 M. }* D
printf("b is %d\n", pshreRAM->b);
" @+ o4 S1 `2 J( j
printf("count is %d\n", pshreRAM->packet_cout);
1 F( |- V F' E7 {; h7 d
count_copy = pshreRAM->packet_cout;
" g& p8 v4 M: g7 {
}
4 a# X; ^2 Y, s1 u5 y
else
. O: c$ o5 k2 J& _
{
5 [# k |% m" {' B
printf("No effective message!\n");
. r1 m: }2 l0 v/ \7 I
}
2 |. D5 F+ S* C+ V
}
2 v( W) O' a6 k) P
) D) Q# a% g# ?* S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. C/ F6 E0 @7 n/ W/ t7 h
C% a4 \; s' e3 C* ]
$ b& n# P# m2 ~! ^. \( Z3 t. W
7 J& W( t' e4 f+ H
' E& V' M" s: m3 T6 O5 v0 l% u
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4