OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % u/ q8 s" S0 c% D& K

+ u, v0 H. H* n  w  S0 v* bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 V3 G' c& f; K7 Q+ s( J#include <unistd.h>2 `5 y* A" S: C; C! d9 m! G
#include <sys/mman.h>
- z0 x4 }8 s' p#include <sys/types.h>+ D! E% ?) p! A8 k0 e1 t1 [
#include <fcntl.h>& g6 K' ]/ r( Y. [7 q
' k/ C: C8 T. h% b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 l% R% D1 C9 N: a; b' Z- n4 P* G5 Z" n
typedef struct
( T3 `4 k/ _" X, H{/ I! d+ L* e9 U' r# B8 C0 g
        unsigned int a;% o& a) [, Z6 ]- w/ H
        unsigned int b;
4 ~, P& a: K; G' J% s        unsigned int packet_cout;2 c: b7 H; W& e: @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) S: V+ Q4 o+ B  U! ?2 u# b) d' Y5 Q9 Z- ^3 b% T! p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: b9 [8 `5 D1 \
unsigned int count_copy = 0;
. ~: A+ X( i: L6 K* ~2 {' e2 I2 n8 ?3 B* H) ]' O8 ^6 H% R

4 L1 b; g$ }  M7 aint main()
2 j" n( W9 H' d/ f; w; s7 F; C: M) V{
( T! E: g/ o' v: V2 f( w8 X7 W        pRX_MSG_PROTOCOL pshreRAM = NULL;
' u/ e: }; s$ _$ d; }9 B$ f: l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! E4 \' i; _; S$ ]( M5 F$ {
& d% c+ C9 l$ e, i) k1 \
        while(1)! s4 G5 K$ L' I7 Y4 E9 e. Q4 P
        {' Q% ^7 H+ q% ^1 ^9 u/ j: f! _9 A
                read_MSG_buffer(pshreRAM);
; P1 o8 ~) R# a* C        }               
  c, P' I2 B: a6 a9 P* T}
; [4 p5 m- W% d6 T: w4 t. o. @4 H5 K" ?( ^" C; M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, v" o  F1 E  _$ \{
2 j* `; Y4 v" N) g        RX_MSG_PROTOCOL buf;
& w: B4 M# H! e0 j        
" C0 _* g% ^* ]        buf.a = pshreRAM->a;3 R% x2 G9 G7 a% C6 l* L( O- R1 Q
        buf.b = pshreRAM->b;
! T3 b7 e3 `9 ?6 H- B- r9 y# f        buf.packet_cout = pshreRAM->packet_cout;
% e2 z* g5 |* @$ A        
# F; E( f, \3 b4 i" n$ U# T        if(buf.packet_cout != count_copy)
1 s# e; N# }  d6 d- L0 f, Z) ^, {& f        {5 J3 h. s" v( Y
                printf("a is %d\n", buf.a);
* A9 V$ k3 h4 A* L9 y                printf("b is %d\n", buf.b);7 O6 \; m0 s8 M+ J  K5 c) h5 B
                printf("count is %d\n", buf.packet_cout);: P) t9 x0 I6 W0 {  a4 v
                count_copy = buf.packet_cout;
) h4 T- l- _. u, y        }
# C9 O  [* j+ S7 H6 O7 f- E        else. w2 g+ }# u  @7 x  K5 K$ ^# ^
        {
2 @* i9 Y" c" [7 m) h                printf("No effective message!");
3 k6 b+ B1 E! u3 t% U# l4 V        }& [+ A: p% P2 U0 [% Z( z
}
) D, a8 Y4 p4 o
* R6 ~$ }$ |: j  B6 B- Y; U8 h4 s5 ]4 q4 Q! X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" O5 V  A8 U) D" E
使用下面代码,对内存使用了mmap函数后:& g/ W/ w3 s% {. w/ }+ I: K. L- B
#include <stdio.h>5 D7 a# i$ R' Y6 d
#include <unistd.h>
) ^4 k& t. m2 Y4 Z#include <sys/mman.h>
% q/ W' |1 z( R; A4 b#include <sys/types.h>' {% V0 U. C2 g4 p
#include <fcntl.h>1 p% ]/ l9 R, a: h( b

  \# a6 M. j9 M* u! N#define SHAER_RAM_BASE_ADDR    (0x80000000)2 }8 _8 J2 a) d- ^$ L6 n
#define SHAER_RAM_SIZE         (0x20000)   
( e) U! X: B1 h9 \* j/ a' F9 X. w) D
typedef struct
3 U& I  }2 h- ?6 H2 R: H( g{
& j& R* Z' G  _2 Q+ o  U        unsigned int a;
. c. x% H  Z0 h+ e        unsigned int b;5 i! w! m5 N$ o7 p3 g9 T* }
        unsigned int packet_cout;
( L6 O6 _0 {6 d7 ?2 \" C/ j* p, t" p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. c) y0 q2 y/ s
& P. O- v2 n3 [6 s7 H/ V
void read_MSG_buffer(int *baseaddr);
0 ]. w) u% V* G8 g' }1 B; _unsigned int count_copy = 0;
9 Y3 ^5 d" w6 G8 b
7 J# U# e+ R+ l3 l; z9 T; Vint main()
: G$ w8 ?: j2 U$ J3 v5 W{8 w' n, p! N( u3 T$ H' T( z
        int fd;- x0 c/ X: D: _% A
        int *mem = NULL;% r1 r1 L* C! n+ E, A
0 o/ P0 w9 Q& U3 f2 Z! Y% O% v
        if((fd = open("/dev/mem", O_RDWR)) <0)  @8 T& m' b) u7 d0 v0 v
        {
5 u, z2 B: z/ l% f5 U                perror("open error");) _. D8 t1 B2 @1 `, Q$ r5 K
                return -1;
: g. A: ?& p  t, v& n4 H        }% }2 a  @- ~% T) u. C
        
4 _# a. e( ]! ~9 v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ I3 j& T9 Z4 P" I
5 }, [+ ]1 H8 N, Q6 R: C        while(1)4 h7 U) X( X9 N* e
        {' _+ P9 v* Y" c
                read_MSG_buffer(mem);- B: w6 J  j. m/ `* V7 r& I+ A) d
        }                3 {- y! [9 L, p9 G9 N
}
+ S; A4 {' q9 D6 r% g2 G
1 V$ S$ Z1 M! k! Zvoid read_MSG_buffer(int *baseaddr)
8 y" [/ h/ E& Y3 C. k8 B4 Y* n{
& V  O8 {+ \3 J  _2 X% r        pRX_MSG_PROTOCOL pshreRAM = NULL;+ s1 C4 b! [% U& _. J

9 ?; V* J- S2 `. \6 i  V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 S( m2 d9 Q9 `! J( c9 A
& H+ c& C; K" {        if(pshreRAM->packet_cout != count_copy)" x' @# `5 G+ }) a. J+ S
        {. g: S2 T& |' {7 ~
                printf("a is %d\n", pshreRAM->a);& z2 T4 }3 L3 L6 {9 \" R
                printf("b is %d\n", pshreRAM->b);7 g& Z& N* ~: H# e
                printf("count is %d\n", pshreRAM->packet_cout);& W" |8 a$ j# I, {& ?2 o
                count_copy = pshreRAM->packet_cout;
1 [6 R6 w( b" U6 y, R( ^        }6 v7 p3 r, i1 T; P4 m6 e2 }
        else
) C0 b* n& m: Q& U        {
) A9 n- ~5 F0 ]/ i. n. k                printf("No effective message!\n");
$ j" w  C6 b9 ?) ^        }5 }* {" o$ H% X* c4 K" Q
}
. K" \1 }! d4 h6 r" Z
( D, H  j3 J/ a4 m$ x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 C( }5 Q& G/ A
9 f! V* N6 E  t8 Q% X: b6 |( l
  Z: q* C/ @( ?2 {) ~6 [& ?; Y+ A8 e- P+ x7 ^

- l. m/ W/ D# _3 Q( Q+ T, q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 05:38 , Processed in 0.038773 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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