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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 O2 M( y, d- K+ L+ E, n; j/ [; w2 J6 W) e  H1 ?! G, k- t0 h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' F( K8 w' i& e- A4 G
#include <unistd.h>. @* ~/ j+ w+ q, C! x+ }* H, v  |
#include <sys/mman.h>- k) Z! G, p& O& l& g9 N
#include <sys/types.h>
1 u8 o' ^% I9 F) K: O( F9 T. J6 x8 B! i#include <fcntl.h>
8 i, i3 [( F* L% o$ ^5 M7 |+ J  U" h* p; U4 F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) ]1 v3 ]0 @6 t& d& _; [) a9 {8 {6 ^. [( Y7 j
typedef struct& u. V" a2 Z) x7 w1 K4 G6 u2 \
{, A: m4 J6 f+ L7 b" E( D0 h7 Z
        unsigned int a;+ ~% V/ A) {7 m% @8 A' R
        unsigned int b;
9 A  z4 I2 ^* ]+ M        unsigned int packet_cout;
: N; B/ y/ O+ O" B" k! y  ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% X6 E8 S) s& J  R+ B" G* ~! e$ h; c
& X) B& @# Q; P/ Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 T  m: o4 ~6 D$ @, \
unsigned int count_copy = 0;# y' n, l9 ~5 S. f/ S

- A, ?4 h+ \4 T& b; l2 n. b2 `
5 q! s  c7 C2 p: Z5 c0 }int main()
4 m5 @: u2 Y: ^* |* l{, h4 o- n+ h, k1 v9 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# b  \) }7 e- v  v( X# {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( j7 y$ u; V/ O5 [5 F; Q
+ a, ^" @0 c* o* ^' B! F- E: o        while(1)
- ~- j' d6 W$ @; q        {4 p, E  |& K7 E0 P7 l0 m. j- a6 P6 H
                read_MSG_buffer(pshreRAM);" L7 V- \# [0 M0 E8 Z8 N5 K# }
        }                . s8 ~9 ^8 n# d3 z* _4 `+ T
}
3 y5 c2 B5 A' _* {( T" s
: ^: W2 C, Y  ?" K* T7 q. Z; tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' M5 Y/ W  M1 @* [& |4 v3 b0 z
{
: @3 N( K9 w& k7 L        RX_MSG_PROTOCOL buf;
6 T, S- V, {- Y& m& Z9 Y8 `        3 `. U" L- d% ~$ Y3 [% u: U# f
        buf.a = pshreRAM->a;
! i( y* L, X. I! G) }1 \        buf.b = pshreRAM->b;
1 ^$ Y$ M# p9 I* S7 `! {+ J        buf.packet_cout = pshreRAM->packet_cout;
3 T$ ~: j/ |3 j+ p* G2 s1 n9 t7 O( v        
, Q* d( H8 a. X2 U3 D$ N3 M        if(buf.packet_cout != count_copy)
3 }$ C9 i" P0 g* }! C6 d- M. l        {
+ M" [9 B/ H/ R5 Q: a: t                printf("a is %d\n", buf.a);( O% j8 n. [  j8 Q* i) U2 ~9 z
                printf("b is %d\n", buf.b);0 O! n* B& _( {
                printf("count is %d\n", buf.packet_cout);' q$ b" @# n  n) \( _) H# Y
                count_copy = buf.packet_cout;; u" i9 m8 ~" g0 D5 G
        }% m; J) ]" P* B8 S2 Y$ }7 a
        else
, {5 j2 m9 v, J- x9 L. P+ u0 |        {
! ]$ ~# l2 }" u# V: n' M# R                printf("No effective message!");
, E: C( p7 ?( o- n2 z& X: c' l; v        }8 f$ d5 w* f: Z9 t
}  y, G4 ~7 z: Y# g% G

/ Y" h3 }# K0 B* b; L
& {# w2 k5 o! j# v" k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  P: a; R6 F; E
使用下面代码,对内存使用了mmap函数后:
7 T; U' K/ B% A4 {#include <stdio.h>3 T+ H. s: w) _/ `$ R* J; A
#include <unistd.h>2 T, L8 Z$ F8 g" t7 ~* h
#include <sys/mman.h>1 D6 x1 ]4 j0 r4 ^' u' N' j
#include <sys/types.h>
* \( b7 L4 Y5 F  J! [#include <fcntl.h>
  s/ h# x& m5 g3 L1 j
; K+ V6 [) n3 m" Y& a#define SHAER_RAM_BASE_ADDR    (0x80000000)% b0 ]! Q; V" X
#define SHAER_RAM_SIZE         (0x20000)   
, G/ l' w  \2 b, X& N9 S1 T
( _4 t% s) v) }4 L0 o# @- a& V3 O! vtypedef struct
3 E0 n3 R5 _; |2 e4 Q{8 y# C7 Y+ l& J# s/ ]% J+ b
        unsigned int a;
6 S. s! z% E- B: i+ m; W        unsigned int b;
) X, `! u2 y, O        unsigned int packet_cout;
: @% L) J( R3 [1 m  T; w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* ]( s3 m' A9 a
/ {& P3 S3 f( O7 k2 F) E& C
void read_MSG_buffer(int *baseaddr);
/ I- a# a( E2 I. Z! v' O$ Hunsigned int count_copy = 0;. @4 z7 O& u2 P2 T* c, {% y/ R) ?
. H9 G9 ]3 W. O& V: D! U
int main()
% L& j# r- N1 l6 \; d/ T, t/ p{- A! _/ Z# L/ N
        int fd;
2 w" l: ]3 }1 P, ?+ u7 o/ j9 F        int *mem = NULL;
. ]; Z. a. q9 T( e" R: F8 n2 W# A* P: \+ I& K$ I
        if((fd = open("/dev/mem", O_RDWR)) <0)* W4 i* W1 Y2 I( A; x7 a
        {
' z; C. y$ g8 M( T                perror("open error");7 G* B4 s  i* u1 P% H
                return -1;
3 E& ^0 e5 z8 X% m0 D' K        }( k& Y" G% v: K
        ! V# J' B. {# G4 C6 f
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 h3 A4 Z$ T, {1 O/ o5 z6 [
1 `$ A, S. P: e% ^  X4 `( T        while(1)+ e/ z8 h& P1 e! Y: M2 Q5 M
        {
- {$ b" m) F1 O, p* }                read_MSG_buffer(mem);3 k% e6 {- z* Z. b) Q0 Q2 a
        }               
5 P6 v! \  w9 x}
# f* [/ P1 X% ?6 V* f+ F2 s" h. @! ~. U  D# Y- i# O8 l) F7 o
void read_MSG_buffer(int *baseaddr)
5 s( v0 c4 ~5 ~5 V1 k( b7 m{# T; J' A  }+ g) R9 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 X9 c' W! F5 o- u5 F3 c* R1 U8 m/ U! W3 C) \2 I; N8 i  m7 p- h7 }
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# o. X7 H, k& }3 z9 v' _! F4 t0 p
, W3 {$ R  O! c9 I! S        if(pshreRAM->packet_cout != count_copy)/ F: c% x# B6 e6 o6 r
        {. N% c9 s9 I% B4 p  c* Z7 z, U, e% m; Z
                printf("a is %d\n", pshreRAM->a);
# V% Z& t* ~) V0 T, H5 V* f1 T4 t                printf("b is %d\n", pshreRAM->b);5 u* V7 |5 W9 L% d! L' @
                printf("count is %d\n", pshreRAM->packet_cout);2 `  b- i( u* _- V# Z8 H6 L* M
                count_copy = pshreRAM->packet_cout;' l# P& f6 t* W2 i5 k
        }
6 f2 I9 u7 ~6 M, d, {$ z) j; u& I        else( H6 z. g# F% A9 w" l
        {) [# L9 ~  }. A+ W9 J/ Q
                printf("No effective message!\n");# v& J* f* t3 }+ {) W% h- y: J  k
        }
5 c' Y+ G: g: a: E) G}7 n* R, E- \6 J
2 v7 K& N( M% m& ~$ \& ~$ {+ w( N+ K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 w/ C! H* @8 [6 l
( N' D" W, }" h# f% ]* z8 `# u; ?" d3 u% U% f8 x
) ~) u! U0 J6 J! _* O) W* a# f, X

# n, ]6 H( }: {. q* ]9 e+ f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 08:00 , Processed in 0.041671 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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