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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 E1 D) Z3 C& [% p) U
6 U+ g9 q( l1 R2 @9 e0 F7 U% _& u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ F- ]! @" ^$ a6 s  G#include <unistd.h>1 G7 z6 T# a* t: X
#include <sys/mman.h>
, ]! v8 R/ n3 S" K& A4 @8 H) b#include <sys/types.h>
5 I6 n# U; q3 I( O0 h! [2 t3 x$ e#include <fcntl.h>
  u& S. |4 a. C7 p: }5 m$ v: i0 _) Q1 {! N6 @; Q, z7 m& t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& Y/ E" m. W7 U, X: G" k. U' L' G4 ]% |! E0 j+ M' C4 ~
typedef struct
+ c5 I6 h5 C9 s2 M6 C, _{2 s+ }9 j8 I9 y. P' y" W+ v
        unsigned int a;
% y  ]6 X  G7 L, B        unsigned int b;
' f% ~/ t6 k+ ?, X        unsigned int packet_cout;
5 l8 T6 u0 `6 d5 n. @3 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 d, E3 \: j& v4 k- Y3 S* s
& Y( G7 B6 Y+ ~1 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. I# _. z( F* e! H7 uunsigned int count_copy = 0;
" I7 E7 D, i" ~0 I# ]/ G
$ i% l, o6 l. C. p9 k$ n
) g# j6 A9 R. `& ]0 s* f" Iint main()* @/ F) f8 {* x2 F* f; ^
{
* ~9 O) O7 b) j        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 _! x* d4 n) a9 m% g9 g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' ~5 G+ ]& P& P% S! p, b. I$ l% e! j, b- `8 E8 W
        while(1)
; |/ `, D1 V* B        {1 U  i' G0 C3 _& b6 ]
                read_MSG_buffer(pshreRAM);, G' ?! Y+ x6 A& |& o6 F/ m' n
        }               
0 |; u& l% K2 [- D8 H) K}
% Y; k# p" O' b0 x1 B% N. V7 C. i$ u- q6 u8 V$ p7 |& w% S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ H, j. m) ~9 |8 Y' k9 F6 i3 g2 S; `
{0 w9 b5 R% j+ b5 V- {9 M; z7 v
        RX_MSG_PROTOCOL buf;- V- @/ x) v, C0 d
        
1 T' N5 a3 e- U! a7 T        buf.a = pshreRAM->a;
! \, d+ a8 p+ s& n) F' x1 g) ^& l/ K        buf.b = pshreRAM->b;
* N, I* E& ^8 j# K        buf.packet_cout = pshreRAM->packet_cout;
& B/ ^% E8 X. s" W. m5 E        
, f/ V, v& s. d; n0 q        if(buf.packet_cout != count_copy)
. \! y9 k) r( i# R9 \6 A! V        {& Y5 H3 ^) {" |1 Y
                printf("a is %d\n", buf.a);+ H! W! k# U4 F1 n- e
                printf("b is %d\n", buf.b);
4 u. Y/ R( S: D5 @+ z$ H                printf("count is %d\n", buf.packet_cout);
5 H- T# e3 }8 s: o. G# _                count_copy = buf.packet_cout;
% h, {% r2 G3 J# W. T        }( r8 x/ k* \  {/ {! [3 ]
        else& S* S- U3 F- [9 M
        {
) |* c2 L1 Y* J% p7 ~                printf("No effective message!");
/ d; }2 j- f' ?" N9 n        }
/ A+ ~5 ?5 r: A  E% a6 i' b# b}. Z' T; G$ K' H; V9 P% r% x5 o
! p* Q9 O% j: w

8 [/ Y2 q( z# F; ^- ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, v/ H2 h* a5 ~+ y( _
使用下面代码,对内存使用了mmap函数后:
( c  @& m* c% n( z& z; {#include <stdio.h>6 _$ H0 |. @& @; h# w
#include <unistd.h>
; W7 w' i3 T1 Y- [5 v6 B. j#include <sys/mman.h>
, F% a! g- `5 @  W" a1 ?  m0 K#include <sys/types.h>
4 o* L$ w9 H& Y- W0 p#include <fcntl.h>' L2 I6 e- k9 ~; q9 [

& T# ?4 `6 A$ p1 H/ v#define SHAER_RAM_BASE_ADDR    (0x80000000)# Q0 D: o% Y3 Q
#define SHAER_RAM_SIZE         (0x20000)   4 v+ w3 L1 J" u4 W# w" O& }

( I# x3 T. a5 g! Ptypedef struct
3 D+ f! A6 K5 N. F{
/ F3 S. R  t! Z/ w: I2 A: C6 ^        unsigned int a;( U7 v' B! e( M3 S, u5 N0 v
        unsigned int b;# f& @, ]2 F4 D' n0 h
        unsigned int packet_cout;$ \3 J5 r6 @1 A* h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, o8 j2 W3 L) s3 {/ T

$ ~0 Y, j% S3 a+ E9 g: P, Qvoid read_MSG_buffer(int *baseaddr);, y$ D2 ~) N$ Q3 D- R5 E
unsigned int count_copy = 0;
; t  B. w! M+ \+ p0 S% H+ w8 d* Q% n4 i; h2 H
int main(), ~% X. d( O* W2 @( I1 K' e& A7 ~
{
" {+ [7 \$ q$ u. L* h        int fd;
0 `/ X9 M3 \4 A        int *mem = NULL;
) z' x. s- g5 M; n/ x
1 G' u# t: w! s3 I- n! y/ F" _* {0 T+ v        if((fd = open("/dev/mem", O_RDWR)) <0)8 q" q. T- v8 S# u; i
        {8 ], ]" T. M; i  u  C0 h/ d) z
                perror("open error");& x8 F5 U. e$ A; h3 F  C
                return -1;
2 a$ _4 T' L8 x) P  k        }1 }9 p3 S" O0 Z4 j6 F3 G8 y
        
/ d; P- ?6 f, }: B  e; l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 q' A  y- v- e1 c5 w

3 j, C  C( b' Z5 h2 p        while(1)- s8 g2 J  W' M  ?) J9 n" t' p
        {$ Y" A) `& x( p5 {
                read_MSG_buffer(mem);
7 @0 J! I  I2 |; |+ Y! k+ @/ L        }               
+ Z0 C3 @  f$ S" f& U) U; Y7 k6 N}% {) G9 y. O+ U- W

& S6 g" O/ k( n3 O6 K0 h& l7 Hvoid read_MSG_buffer(int *baseaddr)% s6 h! p1 o( e. f, e/ u
{& c8 Z# j% i5 t$ _9 E/ R
        pRX_MSG_PROTOCOL pshreRAM = NULL;( e* O0 U. ~5 U7 P% J
4 B+ {, E6 W7 j3 G0 U, Y+ I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! K) L) _# w& Q9 a* ]8 Q+ {8 q6 _  l' B& h6 Y- [
        if(pshreRAM->packet_cout != count_copy)
) `. U1 g  F4 a6 w5 j        {$ V, S1 m+ G/ I. t# R# ?+ d
                printf("a is %d\n", pshreRAM->a);" x9 j  X# J* X. ^/ D, g
                printf("b is %d\n", pshreRAM->b);
/ G: o* J- F" }; W) w2 r, e                printf("count is %d\n", pshreRAM->packet_cout);
9 R" p; c9 J! D% Y* R                count_copy = pshreRAM->packet_cout;
6 w5 v" W2 h9 Q, T        }* ~  M* t; W/ c3 Q, H8 h
        else0 Q, |" G# a6 P2 [$ d; I
        {$ R( o5 `1 N" u; S! q; f
                printf("No effective message!\n");7 a8 \6 k  |* n. t
        }' G9 b! k& y- y+ n9 X. a
}1 k: S0 y% V- C/ q

4 u& }& N2 d: N& }) e; x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 E, P8 B2 n( `& A5 z, O4 a* T! e- w

6 v  S( d4 c- Y& e3 }
# v; l% Z& k4 R' L8 t  S4 l; L! E7 Z) m
7 x, s; y& R. p7 s& {& Z8 G3 u: S/ b+ y! b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 18:40 , Processed in 0.042371 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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