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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 M6 r8 N  M( P* j$ W( s% P1 \- x7 P, q2 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 c2 o1 D0 r2 Z& M
#include <unistd.h>( L2 ^; ~3 E& y) x5 R; Q
#include <sys/mman.h>5 k" r7 M& e& ?7 t
#include <sys/types.h>* z0 e2 `) P9 Q2 m
#include <fcntl.h>
% k0 A0 f' k; [$ X0 D3 W
5 G; z! o& z- v2 B/ ~0 g#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% `0 K% i3 g/ `0 |% D+ F# H% Z) t
5 H, d2 R: H# `, F  h( V9 [typedef struct
5 I  l  k5 l* G4 a* a{
( Z# C7 R* B8 R4 R& X% x        unsigned int a;4 _; T) q8 `: x
        unsigned int b;" c+ K$ _; v  o$ y# w. N
        unsigned int packet_cout;
2 L: C0 w# O  `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* \+ P/ o" @! K2 `* U/ l% F) B1 f3 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! k: l" H1 z" m" Y$ v/ z# p6 B" V9 x4 ^unsigned int count_copy = 0;/ ?- ?0 o; I% V: Z& d% t; y* M
1 Q7 k' Y% D9 h$ v! c; W) {) t
: V4 U- @$ ~7 \
int main()
. V* c# ?! m' Q4 i5 i3 Z9 W! M{
& p& |2 F* s" F8 z% s& ?) p        pRX_MSG_PROTOCOL pshreRAM = NULL;; o$ a4 o' U4 O8 _8 D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  t- k* m& @7 f# {  K& d0 ~* B1 B9 j" _8 |; V$ L2 G
        while(1)
% b0 @& q; p1 K0 Z9 }& ]        {, K. h" \& q/ S  L3 W
                read_MSG_buffer(pshreRAM);. P  D: O$ M/ X' N! ?  U& R2 k  c
        }                6 v9 u; X, w5 B' Z$ L5 l5 Z; ?
}
' `0 @' [$ j! ?# E
7 H1 e3 `0 i- I4 o- t/ k# `+ D& avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  a1 X/ h' K3 T+ l! ~' q2 h! Q1 H{& e3 m. G; c7 J0 t. |
        RX_MSG_PROTOCOL buf;
; Z- [, @/ m9 N        ; M4 T' u" C  v6 R8 D0 r/ `% S( m
        buf.a = pshreRAM->a;
5 u8 a  l- R) P7 y( p        buf.b = pshreRAM->b;, b. i# z+ A4 E; m  E( k
        buf.packet_cout = pshreRAM->packet_cout;* P: c6 c5 N3 a' w% R( I9 L8 s4 D6 l
        
  \) V% y: y0 o! B+ |        if(buf.packet_cout != count_copy)
! a9 L7 T* k) H6 f2 K        {7 \- y0 \2 ^' }5 `! V$ {" L  v
                printf("a is %d\n", buf.a);& Y4 C5 K) y9 i" [$ Y. S
                printf("b is %d\n", buf.b);9 P" }" u5 z, w) J- D- Q. R9 N
                printf("count is %d\n", buf.packet_cout);
* R0 T% D- E9 d2 X! `0 V; N                count_copy = buf.packet_cout;
6 Y% }. D, M1 e% g: h        }0 B0 r( `" x0 H4 b- h/ J" i
        else
. S4 r; D, S" b8 Z$ M" W        {
: S4 \! y6 @' t  D4 Y                printf("No effective message!");' T; `3 W6 r, z; l9 z5 Y0 O8 K
        }7 O" G# o  y  W* B% S; b' `
}
$ [9 d& @2 ^2 v. m( ^7 v5 x6 |
9 p8 d- P6 C: m0 g5 w  R0 v
) Q  C8 V( f: g# J9 b# a( n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 i  ]3 d" y2 Y5 ]
使用下面代码,对内存使用了mmap函数后:% i. G& D( q2 R
#include <stdio.h>
* G- L% c8 c$ y3 B! O1 a#include <unistd.h>
) W0 j7 C, H" w( }#include <sys/mman.h>
+ t2 T' e4 _: Y: f9 ?#include <sys/types.h>( \: a  h' P* z* J; q  E# ~
#include <fcntl.h>! B0 ]- b3 x; c7 Q

! d2 o; r% N5 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)* E* c9 I. E8 ^1 Q& M" N) f
#define SHAER_RAM_SIZE         (0x20000)   
& }. V) p6 e& J  S
: i4 y- k, e/ Qtypedef struct
9 w6 l8 \7 H9 i{8 [0 F7 e+ \4 T' ~+ o; g3 |8 Z
        unsigned int a;
  B, Q9 z8 G5 ~        unsigned int b;
/ [# F! R; q$ p" F+ F. f        unsigned int packet_cout;1 k7 }) Y8 s! l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 V! L; @+ `6 m8 R2 `: d

0 O8 n' P9 g1 |( K6 n; c/ ]void read_MSG_buffer(int *baseaddr);
' I1 q1 ~& _2 C) E0 Bunsigned int count_copy = 0;; W' |/ Q( s2 o2 q! q

1 c- N6 k$ p  a& mint main()! \1 U4 e' M  `) K
{* }# {: Z# Z8 J% S7 c
        int fd;, [2 S3 W  f# E4 ^) _
        int *mem = NULL;
+ R6 _& M, Z" D; r( o+ p% ~2 I4 D$ W
        if((fd = open("/dev/mem", O_RDWR)) <0)
  l2 H7 G; r" Z) b4 g        {
  A( k8 N7 C$ R                perror("open error");
. L0 I6 P! s! h( @0 U                return -1;  s/ m8 ]/ C- v% U- Q4 q
        }( s5 v* Z3 X0 v4 Z2 j# I% v
        ( G! d; k+ n; w
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 u( N# k- d) Y2 w, S8 R6 A
: H$ G0 D8 ^, r1 ]% M1 g        while(1)
6 e7 e. q' B/ M        {
2 f; J' S8 J; a* S7 }$ j/ F                read_MSG_buffer(mem);
4 `1 w* Z  F/ x6 w: w7 a/ g4 M7 o        }               
" T& \$ G+ M. R+ H3 u}" E0 I6 _/ u+ r

3 J5 n: x+ a  g8 ]8 b% @* S0 \void read_MSG_buffer(int *baseaddr)" x  I! }, G5 _% V8 p1 o7 r
{
+ j( @1 }( e0 Z) C# i        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ r( A+ L3 Q+ c: ~* M. J
- `1 _" Q$ X1 O) |: j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 x& i) y. J- G9 R3 j
" F. z& `+ d( F! a        if(pshreRAM->packet_cout != count_copy)
* \* }) z' W$ N9 {7 F, H        {9 O4 H9 W- b% }* v; {
                printf("a is %d\n", pshreRAM->a);: ^  ^9 x! i8 Y4 z2 K% k
                printf("b is %d\n", pshreRAM->b);
8 Y# _7 I8 Z5 C( V- L- d                printf("count is %d\n", pshreRAM->packet_cout);: [7 _, S- w$ B7 k  V3 F
                count_copy = pshreRAM->packet_cout;
" j( |6 ]: k  _. w6 K: w3 y7 q        }* i3 v0 A* s- `' e9 ]
        else% M: M: L# S! W, Z  I, f7 `
        {: Z' U" N' `, w" Z
                printf("No effective message!\n");% {  b5 {  _9 w; P! i& t
        }: e4 d/ I- {9 E; p
}
9 z+ L7 h5 c. ~4 I% k! O  ?2 d* W; P  i- s9 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ z: w- ]5 H$ e  b: a3 i' Q

: a* K! h2 S; q" u3 [0 }2 I& i8 I: n6 u* S
: i+ w7 Y! q* O. R/ K, h/ M
4 x% e* k+ b5 }+ |5 ~3 w- G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 13:30 , Processed in 0.038862 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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