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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 v  ]4 \, a  f9 n1 p2 [$ ]6 }1 P

; t% H4 T, B; p: `) h& {9 H  k7 O1 OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ E, J: I5 \6 X- M5 r* {#include <unistd.h>
) b4 N* A. G0 h3 ]% _#include <sys/mman.h>+ [, s- Y0 _( G
#include <sys/types.h>- C* _3 H; ?8 T- ]4 \
#include <fcntl.h>9 s. }6 `  e' v" D
, W/ q( ^; s1 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 }# F  v/ T, T' Y6 W5 h
2 r: S: D, u5 P( etypedef struct
# |) [8 i0 Z; K: }1 T{& P8 q  Z2 z8 h
        unsigned int a;
$ O( E7 |6 ^; p% c" Y        unsigned int b;( J- T2 y: e9 X$ q8 h, f
        unsigned int packet_cout;
! f4 `; K/ c, f$ E0 u% g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% g, j' g9 q. D0 e7 A" k7 E" k7 X. b0 b! d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. M" {6 I( R0 V( L. r: r; aunsigned int count_copy = 0;6 f0 |( S$ f% h1 M- q, H* g( T9 @
2 H1 f2 S/ j( u. G
% M+ |) E. w, K" P7 f* y3 @1 T
int main()# ~7 k. w. [3 |) a* w3 j$ S
{0 _; z/ s8 r+ X# L+ \
        pRX_MSG_PROTOCOL pshreRAM = NULL;% a1 X- M5 ?  l, g5 U0 g
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ Z7 N- H, y0 n+ R' z0 W' ^

. b+ [/ G: a0 H: |& m        while(1)3 c- G9 O! G' Q- z- s. T; Z: c
        {4 `4 Q6 `( ]" p4 {
                read_MSG_buffer(pshreRAM);% j$ V( I& @7 T) ]7 p
        }               
. y2 D& U: |! [+ ~( e}) C% }% l% x7 v7 F

& w# C, u. k3 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# F; I1 ?' k6 @
{
. D. B+ d# H8 i) y        RX_MSG_PROTOCOL buf;
0 T9 X8 K5 z% e! h1 h# Q        
3 h( m! v% [6 L        buf.a = pshreRAM->a;
, S* G7 T0 D  S' J" j; @$ ~        buf.b = pshreRAM->b;
; v, S& n0 W; u5 K' h2 l! w        buf.packet_cout = pshreRAM->packet_cout;. `5 z$ f) s9 V# G
        
) r: S1 Z2 U0 M3 N9 R        if(buf.packet_cout != count_copy); T5 q! d/ ^& E; g  p$ n
        {* L) l9 j. a; w8 B" Y( T
                printf("a is %d\n", buf.a);/ ^5 k2 S1 y' j. n* g7 M! |
                printf("b is %d\n", buf.b);
7 k7 `8 }# e! T                printf("count is %d\n", buf.packet_cout);, u) H6 Z  S6 i: H
                count_copy = buf.packet_cout;
% K, v5 Z$ r+ z        }
8 }8 [, d5 K' f6 s1 C4 V        else  y  F/ J2 B6 U* ~
        {$ g. y+ |* K% F5 _- P
                printf("No effective message!");
" |5 B& W) g+ g7 [, X        }
. n0 k2 }# e; v- K4 I& d}
! U% [; n9 o5 Q% e! i" I. l" |' g& y: e" d

2 V, k5 E, f3 S6 A. C- y3 E& m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( D# e6 S+ `" R# s* }使用下面代码,对内存使用了mmap函数后:& e" [' v" g4 i- K9 z. l( P
#include <stdio.h>
& C# n/ ?( J$ U' |8 r* e* ]5 q% C  M#include <unistd.h>
. X' r- i, i5 t/ l( x" N& L#include <sys/mman.h>* t; P, @$ r/ p& \
#include <sys/types.h>
& q3 q+ T" f( M9 [#include <fcntl.h>( q" y. F2 {0 O( h+ r) O5 q

% a; o5 ]6 V' N% u0 y/ j2 C; Q# Q#define SHAER_RAM_BASE_ADDR    (0x80000000); d  S0 t" x& b: m9 c
#define SHAER_RAM_SIZE         (0x20000)   . w' y) j' }$ J! K- z

3 @+ g& H3 ~# o+ l! [! rtypedef struct) E& p2 q! h6 R* J9 u+ t) O7 K& S
{
9 g1 [% U$ ]+ Z  e: O$ I. Q        unsigned int a;  b, J/ H9 l* z
        unsigned int b;
! [7 ?, H# n2 s$ P( s        unsigned int packet_cout;
# p: |# W, X3 M. z; H$ A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 r( ~9 ^8 k8 R5 w
# @/ z4 q1 u$ F0 Y# \
void read_MSG_buffer(int *baseaddr);' d! y9 H/ ]( V
unsigned int count_copy = 0;
# U1 w9 \7 a& @6 ?! q( \2 {
- K$ }+ J4 `, U. uint main()
, c0 q3 @  Y+ I{- D( s6 F: b6 _
        int fd;5 k* `; ~. Q6 A: O- z6 }% G( M: c: v
        int *mem = NULL;
* t5 |4 A5 x$ K7 v4 C3 i# R5 K7 l) ~' b6 T5 H# h& A
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 P: L7 ?) ^1 a& m9 ~8 U1 l        {) ~* I$ p% i& E  n6 z9 ?5 h& s
                perror("open error");
7 p  w4 h( U  ], @, c; ~                return -1;, H7 C/ S* e+ m! s7 ~6 [9 t
        }  C3 |! {- m  p: E/ Z, }" U
        2 ^% Z! Q# O6 g' I! p4 X& O- A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( V6 r4 T- P/ t2 ^" i3 S
8 {: w5 b0 O/ e, p+ W2 k! p        while(1)" u+ e2 t% z8 ], j0 T6 F2 g
        {
; r, R; q2 G. X( \: S% I3 |. H                read_MSG_buffer(mem);9 E' F/ u# ?8 E2 q+ S% d
        }               
0 I# V8 z) u4 h- Z5 Z' {! A}* I, j  ?. a' y" X4 p
& q. f8 ^6 ~& S: b2 b& F: x+ H% E
void read_MSG_buffer(int *baseaddr)
' m9 K+ X) ^0 }" Z, [: s{
3 U9 @& Y' `) X1 Z. G  @  M* \        pRX_MSG_PROTOCOL pshreRAM = NULL;
! V  Y9 J6 S  d8 ]. U" {
8 M0 j- X, x# E4 n4 o# Y- g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. V# c2 ]* T4 H% D$ q- y+ l

7 e! i  t4 ?3 z) |        if(pshreRAM->packet_cout != count_copy)
$ s7 ]0 ]$ ]1 b( Y1 U        {' P! L! P! i. a8 d
                printf("a is %d\n", pshreRAM->a);# ^" k& Y' d/ M/ t
                printf("b is %d\n", pshreRAM->b);4 _! N! D- X; Z* l
                printf("count is %d\n", pshreRAM->packet_cout);
  `/ Q  F  Q' L9 m: M. }, o: m! A                count_copy = pshreRAM->packet_cout;# J. {6 |. \1 ^+ ]& x2 r
        }
- E+ g7 a% }5 S% ~5 X        else
* a$ T4 `! Q8 t9 i        {0 e+ L% M0 W! |) w* A% F0 b2 P
                printf("No effective message!\n");
) _0 R: q7 C! K6 J        }
  X2 N  j) R- b; }6 ]# u) ^: l}
/ f9 f8 u. k1 G+ t) v& d# m- T3 L3 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" [0 B& h: S) V3 I* r. \4 v' P$ u# W! p3 d, E& F2 B

( ?5 j: p( n* j: M0 L" I
1 p8 M1 b/ z4 b/ I
  [! l7 O2 j. [, z7 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 18:21 , Processed in 0.056090 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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