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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # `! e8 K7 Q7 {- t0 T# A
6 D& z  Z* R; r9 ^8 Y" V( Y$ Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 k( M2 B1 g4 ?4 m
#include <unistd.h>& p% Q3 m0 J2 W2 Y
#include <sys/mman.h>
9 f1 z, X" n) G4 ~1 I. |#include <sys/types.h>
" [9 L4 Y1 k$ n# `& D; ~/ [#include <fcntl.h>) I/ l1 H4 ~/ _8 n9 R
+ u* E' s' z4 B
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * j, y' l" g# m1 u! F
" F( m% Y& o! u9 I2 r# x
typedef struct/ G) f! F+ r" a
{
& j. V# d- n: W        unsigned int a;; u1 W4 f0 n5 F' b
        unsigned int b;2 A# i. M. O; s$ `/ [/ W- e
        unsigned int packet_cout;4 {6 P" j( |  Y* S' j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) k# @8 b6 T- e
* w2 f! t. W" ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 S. w7 `: e' V' Munsigned int count_copy = 0;
7 }1 I( V- l5 Y  ]0 O' U
" z3 F7 O$ c; R; L) r6 U* x: v* X$ s. ~
int main()- o' }5 {* ?5 D  S+ k1 d+ G
{
" O3 Z- Z3 n) l/ l        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 G9 Q. Q( b, J4 i( \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 y& w; |) v. s& t# v+ k
1 ^6 l0 i! ]. G8 K& Y6 `+ l
        while(1)
6 a( Q$ u, y; b7 g6 G2 v" K1 R        {
8 j' h' x# e- s. I" o. b0 i6 ]                read_MSG_buffer(pshreRAM);
5 B+ I) B( C: m* x  ^  h        }                & r8 I- [9 m7 c' \
}9 J) q. @* A' a: J, k

; |$ r( ]1 @7 ~. E4 ^2 uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ n5 O1 U2 c. }% ]$ k4 t
{
) ]' l8 y' }& M$ }9 ?! X        RX_MSG_PROTOCOL buf;
3 M- j' R" b, C+ C8 L. g. }8 |        
: H' @8 P7 Z% u! `) s        buf.a = pshreRAM->a;; V% g: _3 I  J" t: g+ L
        buf.b = pshreRAM->b;9 v$ r3 x) b# o5 o9 B5 A
        buf.packet_cout = pshreRAM->packet_cout;
( \; @  N1 ~. `4 ]0 R        $ R$ Q4 y% W  T. _2 l- r. ^
        if(buf.packet_cout != count_copy)0 u7 |3 L" y0 Y: f( K
        {7 f3 }5 A) {; C# N) _
                printf("a is %d\n", buf.a);* B* c' b1 w5 P0 ]" q! u- I: n5 O5 A
                printf("b is %d\n", buf.b);
  A1 [$ ?" H. ]5 H& i                printf("count is %d\n", buf.packet_cout);
7 v( Y8 L0 b) H$ S4 H: ^$ A                count_copy = buf.packet_cout;
) l7 S7 F4 G" V# e3 D8 j        }
- ^  w" L4 v% w/ b' q        else
$ y6 h7 K2 g, V" C, ^2 \        {% h* O" E( {7 N" ^- E/ h
                printf("No effective message!");
2 [& c  j) s, R( g        }
. J9 W4 U9 d4 Y+ ?' t$ b  t# [; l}
: `1 `! g' O1 U* D  B* C0 W; d5 }' e

! _7 s; }0 W2 s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* \# Y' s) T8 M4 x! t. o使用下面代码,对内存使用了mmap函数后:" ~, x! r! C  {
#include <stdio.h>, X7 J! l, g; }- A. W3 h
#include <unistd.h>4 ?3 _8 {! d/ I1 i2 W  H' w2 m
#include <sys/mman.h>
) w& ]* [; a4 k8 g  ?) [#include <sys/types.h>% i5 Z( J4 c$ K" B7 j
#include <fcntl.h>
. B( E$ r: R9 a( u2 E. ]' |2 N( l! I7 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( [. b% O7 d! `+ e#define SHAER_RAM_SIZE         (0x20000)   
9 i# Q) d! o9 t6 q% ~, u! ?6 H! v7 y4 W
typedef struct9 e  X( T$ U! g6 ~+ F/ l7 Q
{
6 K; Y4 }+ h3 S- d        unsigned int a;% h( |3 J5 O' ^; z& H* |! f! `9 j
        unsigned int b;
& p  {2 x, N% O5 N- s8 X; h        unsigned int packet_cout;
0 |2 \+ Y* i" g' l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ B4 @; w0 n6 G/ [; ?1 G2 x3 ~
  }. s+ v# {/ g5 K
void read_MSG_buffer(int *baseaddr);
9 t9 ^# G/ p# V5 t0 B( Gunsigned int count_copy = 0;
" M# @) n; q* Z& \% Y! L: T. a9 D6 M# {$ c5 ~+ y# T( |3 c3 k7 G$ h
int main()
+ j# [2 k6 [- N# h+ P  H/ U{
8 Y& m4 j" F! F$ Y& D: C& _        int fd;
) W! _3 P5 Z% b; @: Y5 C; H, L$ d8 O        int *mem = NULL;( P% }  v! f6 ~( W
$ u- x% H' c& Z# ~
        if((fd = open("/dev/mem", O_RDWR)) <0): L6 _; R, G$ h" C& r3 W$ O
        {
' r! R1 E. P4 _                perror("open error");
0 G2 r3 X" d  d                return -1;5 g/ Z& X  H( q5 R- _7 Y5 I
        }
, U* ?& J, W) H3 c7 H% ~- I- R        
1 X# {! |) x* b+ g: ?. O: c6 H- r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& \# O0 C5 T; i' I. `5 l
$ Z9 b0 Y& W3 m2 o% G- |
        while(1)
& B$ s1 x: t; E2 Z5 k$ l" X        {( s/ ^8 j, [0 v# \  f+ W2 s: v$ Z
                read_MSG_buffer(mem);0 n- F) a8 R1 _) n
        }                ( h& e; {: a; _! [. u8 Z9 h
}
/ H4 e( X0 t! C0 e
3 _, [5 x$ x6 K; `5 avoid read_MSG_buffer(int *baseaddr)
% \( c; J0 \9 q{+ @0 N( T7 v0 g$ ^: \- ?- L6 G
        pRX_MSG_PROTOCOL pshreRAM = NULL;% i1 J/ ]1 B6 |) [: H# J

1 A" p/ N3 F; T8 W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: }( ^1 D: h% [- h* N& R( l5 v* d
+ t: d4 C; G: g# z9 d- V        if(pshreRAM->packet_cout != count_copy)7 o* e' [# [. `) \8 p
        {
, o& B" r: n& S                printf("a is %d\n", pshreRAM->a);
) y' I; z, O/ u: v" M9 A/ k                printf("b is %d\n", pshreRAM->b);3 ~( q+ ]& R' p! ?
                printf("count is %d\n", pshreRAM->packet_cout);
2 e5 q, H1 {/ s; a: g                count_copy = pshreRAM->packet_cout;: O( @! V* S+ D. H
        }
5 n$ c, H3 c0 ^- `" g4 B7 q        else
4 x$ }/ v+ H6 m) @! ?        {
/ K7 v0 \1 R  t8 V                printf("No effective message!\n");  u  [) b; j; v3 W1 C
        }: A! a7 Z- ]* K, `. V  V
}
- s6 p# Q3 }( {& g6 m: i! O: z. L/ @# c1 [) ?+ a. q" S2 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 a# z( |) H1 U3 ^6 f3 q& {! y% Y
1 E3 c" j. O7 L+ p* ^

8 M$ ?7 N) A& y( _
" d# r( f0 F& p) T
; Y0 t: n& p( E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 02:58 , Processed in 0.039625 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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