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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 ?7 A3 Y' Q0 k& U. j$ z# v
& g$ a# F. \& T2 W9 ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# |% r; x% {& \9 `#include <unistd.h>! Y. Y$ c4 M/ D% L1 a
#include <sys/mman.h>% q: u9 b/ G( ^+ c9 e3 h5 u& t' P0 x
#include <sys/types.h>/ F4 K9 `/ _# `6 r( ]
#include <fcntl.h>9 k/ Z( y+ a# a0 n: o, j8 k3 U

9 h  h$ T7 }' b/ O. H7 {* v, v#define SHAER_RAM_BASE_ADDR    (0x80000000)   % y. R2 M- `; V! [* g8 ^6 Q

9 E' ^) t5 I9 e8 r5 a$ O/ Ztypedef struct/ r: |& C$ d, E- T3 l$ L
{
2 K* [( _6 H0 v3 J        unsigned int a;7 D- U+ @) z6 x( ?0 T
        unsigned int b;
% C* r, m& f4 S$ r$ e        unsigned int packet_cout;7 {' e" ?. B6 D# Y. J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  M8 Y' ?8 G$ H4 D# T2 [  [

& g- J- d7 T2 _0 n, n8 T6 C3 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 b! m; _7 ?5 r5 _6 m2 X  ]
unsigned int count_copy = 0;
4 |/ Z, _+ G- {9 X3 K2 ~. _7 \2 A6 x% \9 a
5 @, |2 ?9 _. d, \
int main()! H8 {) m# P4 \2 {$ \5 c
{; t% y( l* f2 J# T8 w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ i, W$ q6 p3 V+ K5 r" J$ x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: A$ w) s* p& h# Q% j# @% R/ J; U, Y5 j  n6 p) F% V+ j! k) }4 }
        while(1)
& I3 F% j$ o0 D% O, t, V+ |- D! T        {2 I$ M) a5 F; O, k3 W; }
                read_MSG_buffer(pshreRAM);
3 Q! N5 u' F9 s$ q        }                  d% f  E/ Q. v% f  o/ t5 m
}+ N* a( E% |3 k1 G
9 k: }( E% z5 q  c7 }9 |$ e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 y- d. H$ \% L0 g8 v+ I, d1 P- K' X
{5 L8 `* K! Y# j
        RX_MSG_PROTOCOL buf;
! W/ J" N0 M. v, T' v- O' k        
9 c1 ^8 Y! z* J! |8 ]1 v) {' {9 P! N, w        buf.a = pshreRAM->a;: b: I9 Q! o! M, u$ ]1 M
        buf.b = pshreRAM->b;4 }# o5 s1 ?+ @5 n) X+ m) X. ^2 E
        buf.packet_cout = pshreRAM->packet_cout;
' J$ F+ S% S1 [7 j4 R        
7 N1 F# T0 R& c" ^6 Z2 U1 z2 h6 ^        if(buf.packet_cout != count_copy)
; Q6 \7 W2 h  E8 F& Y        {
1 C: ]/ l  q$ Z4 |$ z                printf("a is %d\n", buf.a);
; s: m1 y' f+ D' Q& k( h% _5 l9 h                printf("b is %d\n", buf.b);
& e; W7 ^* o: t- f                printf("count is %d\n", buf.packet_cout);$ U2 ^1 d7 f' t+ {
                count_copy = buf.packet_cout;
* p7 t# P+ @7 i$ G3 g& R1 l* W/ u: x        }4 Q& z+ x" s" y1 d, ]3 v
        else
) Z$ h2 o* U$ T5 N  ~6 K        {
' X5 |' |  @  c7 i" x/ J$ @- z                printf("No effective message!");1 m2 ^( x: F( R& K, ~
        }' c, j9 ~4 g6 B
}( h( _* [8 Q9 w# g" ~& ~' c: \6 Z

; B+ D1 V, A$ x! r" L( Z6 o' x  u  O, o) Y3 T1 a  z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% N) ^' }8 I/ V5 G/ x使用下面代码,对内存使用了mmap函数后:
0 C' p: w( Z( R2 {0 u#include <stdio.h>
' B" {- ?  d! ?' Q1 S0 i1 A/ m#include <unistd.h>
/ Z" W+ C% C! g. x- e  q#include <sys/mman.h>
" H. }6 ?: E! J$ @  N#include <sys/types.h>( I4 K' a: y6 v1 ~8 A$ |% i
#include <fcntl.h>3 Z( ]% c( s/ g
) N! E4 e0 F0 a' _- r/ }
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( U% u9 z& |9 @6 W! B: Q1 q( F9 p5 _#define SHAER_RAM_SIZE         (0x20000)     [+ q: F  K# Q6 u  c

, m$ Y$ c: b) S2 Gtypedef struct9 R( O/ T, y( p" g
{! H9 E& z$ a- v7 H) e
        unsigned int a;, C" y; T3 @# L' p$ l8 i
        unsigned int b;7 N6 z. s. R3 S, g
        unsigned int packet_cout;2 }3 w  G# L$ B! ]: K2 I! t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* l- C" {2 Q! v: }4 |$ ?# G
  E# s( z: S  d! F& X) v# I
void read_MSG_buffer(int *baseaddr);
" G( J: o/ R5 w1 z2 E  sunsigned int count_copy = 0;; R+ f6 t3 I4 L1 D
' ?3 r) n, k: C- Z, r
int main()
9 e4 h# t' v+ X/ \. x" j{* v  x8 C! C. b( b3 r4 @. q
        int fd;/ R' W3 p. m- j$ _2 p9 p4 P' [7 I3 u
        int *mem = NULL;
+ ~2 M  |  d" x7 s* q
3 y. I. \' m1 T$ i: z  t        if((fd = open("/dev/mem", O_RDWR)) <0)
1 B4 k# @4 k# M$ U9 k  b* ^; d( R        {, Z' f* y/ Q5 l; Q0 K
                perror("open error");4 y- _; ^4 I; ]  Y7 F* o
                return -1;
6 R% A, j1 s& ^# z        }* B: G" f+ s: r( H( Z
        ! L; H/ E. R' V/ v/ X% V: G5 {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 r" t, @+ _* Q: X/ t2 F! J0 T0 C' \
        while(1)
" E: W2 v3 N0 {6 O/ o        {! E( A2 B+ R% G) g6 q4 o3 W
                read_MSG_buffer(mem);
- i; p! r0 P' m& ~) Q1 T; ?        }                % W5 ], c. f8 z
}
8 Y+ \+ `+ w" A5 S: I1 _3 ?' L4 t
* i. v- a" ~( [3 P# P; Nvoid read_MSG_buffer(int *baseaddr)
6 @/ z" H/ F6 o{; ?, t0 q) n, C1 I  ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;: M& g4 p# y+ Y4 h/ D, y

! @* q" D: W. V8 e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& u7 Y, M6 x; {  p& [" K! N# _! n
        if(pshreRAM->packet_cout != count_copy), J4 E7 W8 Q  C/ E$ q% Q7 |
        {
* Y& \  \  ]: M1 X" q                printf("a is %d\n", pshreRAM->a);
; e# \  P" C8 M' W: z; m0 J                printf("b is %d\n", pshreRAM->b);
# ]7 K  [" ~3 b) A( J, ^& L                printf("count is %d\n", pshreRAM->packet_cout);8 \% T* A- w6 a7 R
                count_copy = pshreRAM->packet_cout;
( j$ y) h$ m% s0 _. @        }2 e' \0 c( D' _# i/ h
        else- i7 T6 S1 E7 I& U5 @
        {: L3 f1 o  I* Z; z8 _
                printf("No effective message!\n");
! x6 N5 n% P1 n        }
" T. I/ f" q# i+ C+ R}( x+ R! l0 Z! F0 x
0 T& o% y( o8 |! F* h# t% q% e2 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 v% w+ A! F- M2 o" @' w

3 J$ G% L& o6 `3 I
+ j* L' P/ j6 Q* u6 }/ M7 T' i+ C5 s+ r' \+ {; {

$ ^- ~$ m/ @: V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 15:48 , Processed in 0.038270 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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