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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . N. ~- S: R, X0 C
2 w& r# S/ ^+ u$ y: x! e/ K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 l/ e$ M1 g3 S% \$ N#include <unistd.h>  Y! H5 t/ F( [$ D
#include <sys/mman.h>
" w3 y" [6 q. r2 t3 U#include <sys/types.h>
. l. Q( a( z! I4 e- ?: T; D' _#include <fcntl.h>" B- {+ [9 @& n' x0 z6 \4 N9 `

5 {; e5 q  h) A6 T$ o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) S; w3 i6 D7 u+ X  O5 V4 X  o- h) L5 `' ^" K. W8 n
typedef struct% f0 r4 M5 I: \) N" M; {
{( H: K* I5 Z2 c; K: w" S& }, Z- U1 n
        unsigned int a;( {& C7 j5 N) ^: E8 x2 w
        unsigned int b;3 U. c( H5 x1 J; v7 f+ Q
        unsigned int packet_cout;
6 l! V  _( e' g5 P% P8 j8 V3 w7 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 F# [7 Y3 z5 T8 o$ y% Y' t2 V* D, H+ p& Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 o- e" T# Q! k3 G0 w" l3 }unsigned int count_copy = 0;7 O9 c6 q) _- B
9 M* y- ]% b5 P

) @! k2 x4 n+ N, ~: uint main()
& s* a2 ^$ x0 s6 s6 D{$ C) k( q9 `. M, @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 E- h; T) \' F; S( j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 Q0 n2 F: i- m. }% A6 P. o" M. r) ^7 l. ]
        while(1)) _7 n& u3 H5 h: e: k
        {# @  m/ U. k( L# z6 H- I- y
                read_MSG_buffer(pshreRAM);% N0 ~  o. A, }/ R
        }               
0 ^9 U% C$ q: N! d}& \" i1 i& Y! _$ L
: i* D5 c2 ]8 X  t) x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 d7 S! Y6 M' ^' i3 j; I
{
, j( }1 E4 e4 p1 ?4 ^0 P$ j; O        RX_MSG_PROTOCOL buf;) T7 a; m  }( G  r5 y. R
        
. Y1 c% ]3 B, \" g. ?        buf.a = pshreRAM->a;
, z7 j8 Z! q5 _; u( _        buf.b = pshreRAM->b;* Z+ k; S1 q- O, B
        buf.packet_cout = pshreRAM->packet_cout;0 ]6 g- n. W( p# x  k, L
        : ?- R- H$ _& D' ^  Q
        if(buf.packet_cout != count_copy)
* x7 u5 J; _' N( m( A+ a1 m        {6 {, w5 B# X, d, }* r  K
                printf("a is %d\n", buf.a);4 C% O' v8 x8 Z5 V2 j7 J1 y2 p* u
                printf("b is %d\n", buf.b);9 E5 u. E3 @# S% [3 ]% b
                printf("count is %d\n", buf.packet_cout);
, t+ _) [( ^8 ~9 a                count_copy = buf.packet_cout;
& Z, a  g- t# w9 _" N' b: x3 @        }/ Y: ?2 c& C- m# ^
        else4 I0 j9 E5 }4 U  h% M7 v% F
        {( ~6 L1 \/ g) Q& b; h/ u6 p4 W
                printf("No effective message!");. \3 j+ Y! z1 _1 X9 l
        }& d% {2 z0 f! y3 s7 {4 R  n
}
. a3 I' B  W0 b9 c% d$ c  l/ a% r6 m& f5 U6 Z3 P
. N' `2 M2 Z4 K8 q9 C8 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ p- V/ N- z. W% U) T
使用下面代码,对内存使用了mmap函数后:
0 L! H, x! t/ w, I; v9 @% N#include <stdio.h>5 r* D, b: F  t, @, A4 A1 F
#include <unistd.h>0 Y$ \/ v$ Y$ t8 d0 O
#include <sys/mman.h>5 L' K: ?  Z" M
#include <sys/types.h>  t# {9 Z$ a: u5 ~1 |2 J9 J
#include <fcntl.h>& b3 j2 S0 _  z. ?: }
4 a) k$ ?: Y, n3 n" K0 Z$ E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 \" I0 v. @# ~) q! Z3 X% p0 @& i2 J- r#define SHAER_RAM_SIZE         (0x20000)   
8 H9 j9 z( F" ?8 A, r( X& ^  o7 E  V. [2 {! s5 W* U; X* @
typedef struct; K+ \1 Y2 b; p( X- J* g& o1 f! ^
{
, W( a- x3 [1 d* V        unsigned int a;# e" L1 X/ j, n/ s9 O
        unsigned int b;; C; n+ m4 h: s# s
        unsigned int packet_cout;
/ R& X  [% Y  p5 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. d7 ?  O) U. k$ P# Y; @+ V
; U$ |, b; }! S
void read_MSG_buffer(int *baseaddr);
: z8 _: j0 q7 y" C# E2 \( ^3 Gunsigned int count_copy = 0;
+ ]: S& [- K, Z: i4 v1 @0 _) i  C; F* e$ S
int main()' t9 y0 s) Q6 C- a! K8 S, C. g
{) h8 l. A  s. D! D' U+ _
        int fd;
6 y) A: R% p2 W        int *mem = NULL;
( S0 @& o4 Q( a; ?, }4 v' P1 L
4 S5 ]$ Z6 R4 K( j* X0 z' Q        if((fd = open("/dev/mem", O_RDWR)) <0)
; |* M9 ~- S/ y6 i) I1 s8 }! d( _        {
( c% U2 P1 l1 a$ z( E                perror("open error");: }0 ~$ `( D6 `6 r  E
                return -1;! E  a# L% T; \- S+ U7 J5 U7 w; I
        }; D( h/ C, C; W! b5 w1 L3 Y
        
# `" d: Z( l- U3 L/ L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 G; n- X- `, A4 o
- ]0 p5 g0 Z9 R/ h! r
        while(1)
6 k) `' G3 ^5 o        {
2 s) k) ^/ P7 T7 U6 h                read_MSG_buffer(mem);2 s  J6 w7 ]: T; M- ?: ^
        }                0 v: d# p8 ~* s- H, u+ o
}$ W7 }  |$ X) O( d- t' \! m7 l

* M/ m. v( f/ w5 G5 I$ Pvoid read_MSG_buffer(int *baseaddr)& g4 i$ t4 M/ N/ D4 y: @
{
- T) D. Z8 N5 t/ B' f: l        pRX_MSG_PROTOCOL pshreRAM = NULL;& T" e6 O) K7 {7 F# Y
5 z. l" D& r/ m2 D3 h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* O* u, D" c% d3 b  ?0 x# G

" r$ ~" d, t" g        if(pshreRAM->packet_cout != count_copy)$ t/ s- M5 _. C
        {
) D; N6 H# P" e& l1 A8 F5 q                printf("a is %d\n", pshreRAM->a);% R( A. \. H) ]$ V8 Y* f& ^
                printf("b is %d\n", pshreRAM->b);) M5 m8 y/ }" G1 v$ x
                printf("count is %d\n", pshreRAM->packet_cout);
  W* i! u+ n" U- w" L) `3 _7 D( x3 ]                count_copy = pshreRAM->packet_cout;7 n5 v% h( W8 D
        }
  I; }9 I* y+ l8 }        else8 R% \/ x! {5 f' ~9 h3 Z
        {
  B% E6 f- D  z2 O                printf("No effective message!\n");
8 d- v+ B! u7 {& x( d: p        }' q8 K; T+ P7 i+ l: \
}
; L1 v' o3 C" [  ~) h- Z7 q$ k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 a. v' V/ f3 t  X1 o1 ?9 n8 A) g4 C; z' m4 k' t6 [& r  q
! k* b! ^" I1 p, ~6 t  c
! {) {! o, r! c/ S4 B9 K

3 F0 u& N  m! n3 b1 i/ K+ d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 23:53 , Processed in 0.048314 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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