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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  D, I  K  K7 T
( ^" D1 u% k0 d4 A$ o7 d+ UOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( Q* A, D, {. j' y) A) S7 `
#include <unistd.h>1 r: K3 `' G3 w
#include <sys/mman.h>  }: L8 Y  y4 W9 H! z/ _, t: k- q
#include <sys/types.h>- \% G# z* f) h+ f4 W+ T8 [: ]' ?
#include <fcntl.h>
) {* z- R& A- o$ b9 ]3 X
, J0 S4 f4 i6 j* E* l0 l' \- r#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; x/ c: j% |. n/ t* B

' G# o5 X9 V8 i0 }3 ]9 itypedef struct
9 p' n4 G- g  ?7 X4 @9 B{
( q, H5 C0 O) i% l5 [& z        unsigned int a;
% ~2 t5 G* S: |8 \9 {8 [% z' m! t        unsigned int b;. A4 E# ^9 q. W, Y" x5 D
        unsigned int packet_cout;4 C2 y8 Z* Q# z  j% |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 z4 y0 u- O! t) H2 p: U

0 ?' ?, R" g, ?2 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" l5 J) o% ~2 b2 \& E( J; D
unsigned int count_copy = 0;
* a5 z. t, F/ n7 v9 P- ^% [# Y
! K0 N) e1 H! y/ a! P
3 q  n1 J$ W3 Jint main()
  u. a  w) U( h3 k3 P/ v3 D' w, \{2 B6 ]4 c) X( t5 M! p1 v3 ]) @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 A3 ]7 f6 R3 T  ?  i0 p2 U9 m* {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* I6 n2 x3 H# Y  o3 q/ g  ?
% S8 q- D' C0 ]0 M3 t& m) F
        while(1)
* f0 _$ N1 e" `3 q: @/ v/ F        {2 y" B3 ~8 A' h) Q
                read_MSG_buffer(pshreRAM);
; D& p5 w8 D# Q        }               
, i+ P! n; ~  ]+ V' Q* @}
5 e0 c4 u' \" V6 }7 A1 e% E( ^# ~7 a. f8 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ r! f2 u0 P; ^+ V, S
{
4 f+ d6 B+ M  W( b" s# W9 S0 [        RX_MSG_PROTOCOL buf;$ k. r/ Z/ W4 [
        
' |$ \  c$ g8 f* u# Y. i        buf.a = pshreRAM->a;8 C, W/ S1 G/ r1 ]: W1 {  ~  E
        buf.b = pshreRAM->b;6 O/ I8 a* r( a& F% f% ~
        buf.packet_cout = pshreRAM->packet_cout;8 ~% A+ y6 M/ J1 M
        ; d: p/ V2 \" d3 g  r: v# h6 j, H
        if(buf.packet_cout != count_copy)# ^  n3 v( N9 ]9 B) @; ~
        {
$ [& s, A# g, H8 |7 `% l                printf("a is %d\n", buf.a);5 ~- i3 T- g3 L7 j4 m! e
                printf("b is %d\n", buf.b);8 E7 |. S' I& `$ P4 L
                printf("count is %d\n", buf.packet_cout);' g1 ]( F& X% i) O7 ^
                count_copy = buf.packet_cout;
) @; l" _0 b) j& B0 l# F: t0 \/ v$ O        }5 L) j# m: ?% b8 v3 O4 t
        else- I4 V3 w4 ?; [' D
        {% U  ~: o: Y, J& T4 K$ p. H* E
                printf("No effective message!");6 u  G9 ~* g9 |
        }/ J" D- b$ X  Q' u5 g: w# f
}
. W) [! z% ~6 n7 l0 u$ R+ u# F$ C/ Z  v9 ~. W0 ?% ?1 d

7 m4 u  F: F% [. @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Z! _( H8 y4 n6 i8 n9 q/ U使用下面代码,对内存使用了mmap函数后:
% q+ w! b! c7 R5 L7 a#include <stdio.h>
& {# i. e0 r; G: Z. l* w#include <unistd.h>
# ?) B3 N/ d& ]  D5 r5 t' R9 B#include <sys/mman.h>
0 ^; z, F9 m+ e6 Y$ [6 b6 A, L4 Q#include <sys/types.h>
. k/ C% g+ ]. t9 V8 A#include <fcntl.h>
; C5 v! t5 K% _& e# G: {/ A& W
$ U4 y! c& y2 H, A" b+ D#define SHAER_RAM_BASE_ADDR    (0x80000000)
! H3 D3 f. g% R. n4 F, P; F#define SHAER_RAM_SIZE         (0x20000)     w- U8 T* r1 V% W! ]# W! G
. G$ q& q# N! y0 k. y7 e$ a
typedef struct
+ F" _9 m* [2 Y( M! ^{) Y. @2 K5 U5 y$ L
        unsigned int a;
( |1 f. E( \: M- ~% B8 I, g; [        unsigned int b;9 L0 N8 i0 Z. r, ^% ^" B7 n
        unsigned int packet_cout;  d: ~4 o4 c) ]6 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 g# x3 ^6 E' o0 b' Z4 [& H  \3 g# i/ f0 {$ |0 ~
void read_MSG_buffer(int *baseaddr);% q/ ^! n" E7 X9 R) G
unsigned int count_copy = 0;
+ Q4 a* P! b0 i/ x& n8 l$ ^# _! h( g; Q4 Y2 B/ o; O
int main()& p0 s+ Z3 s7 _4 \
{6 E) K# d3 l7 \' y( m* l
        int fd;
/ y( b. G" Q9 h/ b, f" r        int *mem = NULL;
2 x' I1 \# U6 s2 F  m! o1 A' E# g9 b$ G% N( t
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 e0 I$ ]3 t% y& A* E        {' v+ ], M% a2 m7 u  W( b1 {: |
                perror("open error");
' l6 x- S8 T! p% d8 H7 |  {                return -1;
! D, O  c+ X- O8 ]        }! \  A' A* n/ h5 M5 I6 k1 z
        $ g$ R3 E( Q6 H6 `5 o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* J6 ^" G' N, w/ Z
* T- ], _$ H( \4 N! O; ?        while(1)0 h$ g; T  Q5 ?& E
        {
1 u+ ~7 B1 a/ ~; V                read_MSG_buffer(mem);
* o5 e* P0 W# J; s        }               
" S- W0 H( A; X4 L) Q& p6 s}2 N! w2 o4 t  O% a# k
8 @7 l% n. A% k0 [3 h+ u: N) m7 X
void read_MSG_buffer(int *baseaddr), v$ m* O! p5 \$ I  x/ E
{
: Y/ Q- d1 H& r        pRX_MSG_PROTOCOL pshreRAM = NULL;( v' y7 H( c( C' p

8 b5 o% A  }! v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 [# r, G( U9 E+ K8 ]5 v+ R* `& r+ y* u$ B# o
        if(pshreRAM->packet_cout != count_copy)
  r, [- V" f* A2 d        {+ x8 D- _' q8 x9 ?. |
                printf("a is %d\n", pshreRAM->a);
0 l1 c' p: p7 s/ ?1 e7 ]$ ~                printf("b is %d\n", pshreRAM->b);, g* m" i; \7 ]* W! A
                printf("count is %d\n", pshreRAM->packet_cout);) \! ^' y. W' C0 L! C1 K
                count_copy = pshreRAM->packet_cout;. _  x4 i5 M9 m6 I, M* S6 U2 z3 G* s
        }& I) e3 ^4 ^/ U' v2 x
        else
* P) M0 _$ M+ {- Q0 H        {
! e- s) @  X/ P  G. Z0 K3 `( \( t1 t0 ?                printf("No effective message!\n");
* Z7 R4 j0 b: r" F4 k3 t- s8 o        }
$ f  y, ~6 O% {7 h9 }+ @' E9 ?}% s, h- i- F  E, _

' x" q. S4 H: ]+ |! H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 o# E% H2 m; {, {
* H4 v4 M1 t7 l0 x% l
4 j( r" j, h( _+ l$ b" v/ [1 x
% v6 d4 o2 ?) S8 x& s8 b
' W/ _( b6 n2 `4 G& r! p6 ]6 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-13 06:27 , Processed in 0.039945 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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