OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6033|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 F. K/ I4 J8 R  f1 d  @" S' |! U5 Q3 u( L. g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 ]8 y" Q$ |& |: y" h#include <unistd.h>& V. n" P" ~. L$ l! `2 q
#include <sys/mman.h>
; h6 Y& M2 m3 l8 z2 ~#include <sys/types.h>
' @3 I. \) [0 p  b. i; K#include <fcntl.h>
1 ^) F, p/ R2 M3 |6 t3 H4 W1 q. ~0 X
  D6 k, A6 G" D; w5 e8 o* K( S) A; A#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 B- x0 e3 j+ e, N3 `
$ L6 k) m+ M$ f/ H+ F4 Qtypedef struct
) E7 _' L7 w# |{5 |* l7 p/ v* N3 ?
        unsigned int a;
# Y7 I  M) N, Y; G4 M* ^. i        unsigned int b;# a6 G- B  h# f+ N9 g1 i: {1 a6 t8 F) Z
        unsigned int packet_cout;& ?, c' }0 W/ g; X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) V/ J4 A. @% a6 w) C" Q4 o
; g; R: J9 v7 y. yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: N8 L3 O4 w) w4 t+ i  V1 Funsigned int count_copy = 0;6 b/ X1 j+ T) ^2 T$ Z: w

/ `- {5 k& ~4 ]- T/ _  n2 _( H, R0 g1 b4 a$ P5 W( d
int main()
# n( S$ P# j9 @# A{9 f. ^: {, s3 _' f6 c# P
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ X6 g4 }2 G' t2 K* a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* x& s# U  k4 z  `( x( B2 Y5 a8 o
' E1 H, K/ g- F( P( z* z        while(1). F8 D2 C. x6 u% R) y
        {0 e) F5 `7 P8 G7 t
                read_MSG_buffer(pshreRAM);4 W! u$ D% W' L+ t+ ]
        }                & F4 _0 N1 \3 m: E/ ]
}& p! X4 r" [* K0 B' K
% ]3 r1 @: t8 Q# `4 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' d* a" \8 M# z7 C( V# F: A{5 e  `) W2 q( B9 B
        RX_MSG_PROTOCOL buf;
: o# F* s& Q( C" v        2 Q0 Q8 k. v" E- `0 V1 i& Z
        buf.a = pshreRAM->a;
% o* b: S% I1 l+ }7 K& \" i* s        buf.b = pshreRAM->b;- ]4 A: O5 P; R/ {) s1 S3 Q
        buf.packet_cout = pshreRAM->packet_cout;" \" ?/ D2 }" |. q$ \, F2 B
        ( Q" o6 b6 ?) |* {3 y- @: X
        if(buf.packet_cout != count_copy)' ^: A1 s+ V# M. k+ w3 a) b
        {
' l! s! F) x3 m+ y' g( k* d                printf("a is %d\n", buf.a);
3 W! p6 B7 M) |7 o  f$ r8 c5 O                printf("b is %d\n", buf.b);
+ s( Q. r( E/ L8 e                printf("count is %d\n", buf.packet_cout);: R' P3 o4 ~) r  Q7 E/ O
                count_copy = buf.packet_cout;) a  A$ f0 j5 w
        }
7 b$ m8 v( j+ w9 g        else
" ?9 l/ j' G7 w. X& y        {" l7 R  h  {# S& P: `/ \0 N
                printf("No effective message!");
1 g+ j+ W+ F9 S( O1 A        }
4 b* ~$ `5 K4 k% x$ n/ S}
: b2 k% s% `0 R" u1 J. g( z4 j
$ i$ C6 V: F  W4 |
5 c6 k% q: v* R2 m. U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ C- A, }* U  P0 A
使用下面代码,对内存使用了mmap函数后:7 J7 O, u3 m) ~3 x! _2 A/ ]$ F
#include <stdio.h>
" ~; t: [. K, b, C% ?  e; L* E#include <unistd.h>
: Y" x5 b, g- z6 F" {- C! L* r#include <sys/mman.h>
2 L9 V2 G& g& X7 D3 @" H5 [#include <sys/types.h>/ V7 E* }5 f5 S9 N+ V2 J
#include <fcntl.h>
& M6 z) v0 p* ]- P: p: ~, k0 U! J! a# j1 C
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ R4 o) F8 ^( Z. i% d#define SHAER_RAM_SIZE         (0x20000)   
8 l/ I; ?* Q+ m6 d1 q# t: ]' K( l: D) \1 Z+ }
typedef struct
" n; Q( @* Z# \% f{
: u; o: r6 j( [) X' ], P9 s0 ~  f* A        unsigned int a;/ R7 b8 U6 Q3 x1 v3 e" ~. b; t% s
        unsigned int b;
. B5 U. X6 t5 E- }1 t5 o% W( W8 Y, m        unsigned int packet_cout;! T2 |/ j  Y/ Y  b* R3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 `2 j' J6 L+ Q% _5 |
  r$ e  d5 J, M4 l% a7 ]6 N
void read_MSG_buffer(int *baseaddr);. p; e" n+ A. T! ~5 S9 t& Q
unsigned int count_copy = 0;8 P; f. Z* Z9 Y/ r

, Y5 F4 y) F: }% X' J- X- K  iint main()! d, |( B* L5 |& y# a2 h* Z
{, N3 ?. Y- A2 k6 Q0 _  s7 U
        int fd;* ?5 H& Z5 a" J. ?+ f. w( c
        int *mem = NULL;
6 u8 ^8 j: h3 d0 \* S
' Y9 Y4 ~! `" w5 j; E0 R/ Z$ y: N        if((fd = open("/dev/mem", O_RDWR)) <0)" R$ G0 X7 R: M* Z. I( }( i
        {( l0 H3 E; s$ [
                perror("open error");
3 x% x1 ]! y9 Y( F3 n# a; L; ^                return -1;" G9 x9 u: \6 q4 J$ @2 p9 r7 K3 U
        }
% o0 x% B8 d) C7 v2 ]/ f) U        
  z0 V3 M2 C5 O! x7 I& P$ n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# ?6 V/ K$ R5 Q3 ?6 H0 o; j
* }) E/ C- L* g- v4 G2 j1 X
        while(1)
+ Z" g, [7 r$ A" `: h        {
, }0 K# N* C1 y! ]                read_MSG_buffer(mem);
! R- E3 n! e" V9 D        }                9 a8 X7 N! m/ e4 f; @( R
}
9 ^' S  P/ _4 Q4 P( @! V; z9 T
# `, S' Z) \; C# y3 C8 c  w: Lvoid read_MSG_buffer(int *baseaddr)  ^5 s: B  g; X8 T% v( {
{
0 Z: E3 c) I" n- G        pRX_MSG_PROTOCOL pshreRAM = NULL;' L# v5 x3 o; A, F4 q
" R9 w* ?# _3 q1 A/ x" y7 T/ s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 F; Z) @! f, ^. P7 f
. ?- S7 B6 Z( b2 q0 F* U
        if(pshreRAM->packet_cout != count_copy)9 u$ C( W! z) W5 i' Z
        {
$ r5 A  M- D( z* `+ q: N; A                printf("a is %d\n", pshreRAM->a);
2 {. x! V' P* ~8 c: `2 }- g                printf("b is %d\n", pshreRAM->b);
2 N% f: b" \: i9 B, O; K                printf("count is %d\n", pshreRAM->packet_cout);
( g; L7 W6 r2 r1 o, v                count_copy = pshreRAM->packet_cout;
4 F% k9 V4 ?1 N0 B5 Y- r+ S% w) ~5 c8 M        }
/ ]* m* V3 W- {& X( y        else
5 q, ^2 z& t" p# a: p! Q. w1 T        {& l9 b6 Z8 g# L
                printf("No effective message!\n");  ^$ u, ~: [$ I* Q/ P' \- [4 o
        }
2 i8 p0 R2 S& ?9 E+ m4 n}
) u; V  v) M; w  {7 }6 H! V) y1 O7 e, ~8 O# G& u8 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 o0 `4 i; N: V% ~

8 R! G- J# d; n# H" ^5 |$ I# j3 Y
5 w* m3 B' X: O4 X
7 I1 D. S& J& {1 ~  B) t  V6 n
7 G4 i4 j% J. S, I, Y. D* v7 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-4-4 11:38 , Processed in 0.041132 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表