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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) H5 N( H* T, e2 }$ X5 s

5 Z* }8 `) Q. _, d" eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 B8 u7 Z/ F! b/ l* `6 C#include <unistd.h>6 p% X3 q) y8 r8 D
#include <sys/mman.h>6 s7 j$ a! E5 h* f& s3 J
#include <sys/types.h>1 |: R' w$ F) W
#include <fcntl.h>6 x4 e- V" l# \  r  u
7 Z5 E9 ?3 s: c# [, U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 [9 z# Y" y& Z- v% e
: h# q' Q; g! Q8 e2 y, b. wtypedef struct9 p9 n+ Y, I" b5 x; }
{+ z+ O/ J0 ]  M+ E5 o- w+ g
        unsigned int a;* x* B/ ?/ d0 u( ~: p- t. @
        unsigned int b;( n5 ?* m& h8 Q6 ?
        unsigned int packet_cout;! E$ {+ I; Q% P  X/ y/ i# r! G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ _' _, H# H, D5 ?  V
* ?1 g( f3 U5 K* l- Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 \' R' O* W" Z: \, t- Zunsigned int count_copy = 0;
8 [4 i9 D6 I9 i# q  G0 o+ r/ L
+ U( v& x& B, }$ n
9 u: b* _+ R+ p) Z" fint main()3 Y# |( e4 i; h: {' z
{% l0 \8 P5 ]% c( N6 T7 w5 M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( m+ Z- E/ V7 t( p; y2 A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# S" e; g* ]; C4 y8 N. _. _

2 r5 t  P) t- x4 a: ]        while(1)6 d/ X4 K. c9 I# w  n8 Y& L9 a
        {
  G% ?0 f5 ^! U                read_MSG_buffer(pshreRAM);
1 u, Q2 @! f/ `. S5 H9 M$ ~        }                7 r) n) H2 b* b7 a2 [  p: a
}
8 K& v) A4 p2 R3 `# F# E5 ^% `- w/ q6 \( m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 W+ X3 N; y* w( C{
8 U  ?# X6 K/ v        RX_MSG_PROTOCOL buf;4 x+ E4 [+ B) R+ }! X/ l
        . M" k8 R" P' N. @
        buf.a = pshreRAM->a;
! Y7 T3 o3 Q8 t        buf.b = pshreRAM->b;
* x: p& T9 V1 g( U$ D; d        buf.packet_cout = pshreRAM->packet_cout;
- T$ O; N( T5 R8 Z& a# ]3 N% C0 t        
% W; ^% A. b% G8 K+ q: p: D3 x/ A        if(buf.packet_cout != count_copy)6 f% e& l2 T  C, M+ \! [
        {, ?9 u  m9 e  e2 o( Z" a- ]6 q8 V* e) e
                printf("a is %d\n", buf.a);
" \% T& A7 F+ f) f% M* b/ S                printf("b is %d\n", buf.b);
: X3 x& x0 B. m8 L/ I8 Y$ c                printf("count is %d\n", buf.packet_cout);
( H' K( e% h8 W9 \, l1 R7 m6 |6 {! F                count_copy = buf.packet_cout;! h' r4 k) z3 U) J
        }3 W  G) x' h7 S+ X
        else
, |4 a) @' m. g7 X, l        {' d2 J. Z( X* A) V- _8 E, i
                printf("No effective message!");  `/ Q1 L$ \9 c1 T$ _, M' M
        }
# x3 \# @* n# \( ?, l}
0 j4 ~; ~7 X( \" ?- w% ?, {$ R/ R5 G. f

- v2 z) s9 y  `! }" E8 E: Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 ^9 F6 |, U) T/ A5 f% C使用下面代码,对内存使用了mmap函数后:
- Z5 n( d5 p# q: ^& @! ~#include <stdio.h>6 J; O6 u0 t+ O$ O( b% d# K/ [/ \
#include <unistd.h>& k3 n+ U# v7 j" v+ {$ t
#include <sys/mman.h>3 _8 G& h' }( E8 a9 \  f, H% a
#include <sys/types.h>
* J# E7 |, S/ p* @" I#include <fcntl.h>3 d1 F3 z. ?2 t/ z8 [+ I
/ h! W( m; K! n: [% H' `/ K3 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)  i$ J/ N' V6 A6 K7 {
#define SHAER_RAM_SIZE         (0x20000)   2 d( z& a. B6 y/ E% O6 u  T
+ a; D- u0 w& \# M* A
typedef struct
3 u* L, K) I; I$ @: Z' S! M3 @0 ]{
3 i, Q8 a) T" d$ S        unsigned int a;% `* Q& H% |) g9 e6 m0 N
        unsigned int b;
/ ~; h  ^, ?/ b3 H. F5 v6 T        unsigned int packet_cout;& S# k4 c7 H. g/ S1 |* F3 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* H3 a! b. x  f% E' q
4 p% L2 k; O% W3 X' d' t! T
void read_MSG_buffer(int *baseaddr);
2 _& V9 n/ x  v! Tunsigned int count_copy = 0;2 _0 f; @4 B+ G# u0 k

4 r6 k1 Z5 c, ^& x) Q+ O7 yint main()7 x- G* f% G5 A( R
{
/ B) c  {4 ]3 ^. ^& M        int fd;$ c( m/ N/ W. }( p8 ?
        int *mem = NULL;- p- [5 S# U2 [

2 u: a) H5 f9 F5 k5 I        if((fd = open("/dev/mem", O_RDWR)) <0)" b2 c% e$ X1 i, D
        {
, a: W3 d. s6 r/ @9 g: v0 Z                perror("open error");, H4 t; x* L/ M$ b. P/ `: D4 M2 d
                return -1;
  s0 r+ a( h+ p4 F! b& ^        }
/ L* _& s6 f( C: A' F5 _! _+ s        6 q* Q; K- G1 h0 ?1 E6 N2 k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- \- g1 U3 X. C. C. e3 W

$ V, ~/ J: }$ g9 t; Z" S        while(1)
! g* l  v% Y2 X        {9 s, L# T% c# k, L7 }
                read_MSG_buffer(mem);
) H  L: v- N3 ]6 j! Z7 O' I4 c        }               
; n+ i& }: \" a}' [2 N4 k# g. w2 \) a' d! q  B

6 K/ f7 L- G+ ^# v. B+ Wvoid read_MSG_buffer(int *baseaddr)+ C/ O% {( B5 m# l0 \, l4 |$ d
{8 s  W: M: i, H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ B1 G- g# Y. h* t3 n! C6 H) r  _! ^: |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 {5 I  V, y/ C# q9 E1 U4 [6 ~; Q& g
        if(pshreRAM->packet_cout != count_copy)2 T7 N; B/ _- k  D
        {
, C) v3 U1 P% W+ {                printf("a is %d\n", pshreRAM->a);
8 [8 L$ C1 x  |) O9 t                printf("b is %d\n", pshreRAM->b);
7 V( m: U/ D4 N) r7 N" m                printf("count is %d\n", pshreRAM->packet_cout);+ w1 P; r0 C$ e. g  j9 L9 s; I, d2 N
                count_copy = pshreRAM->packet_cout;
! n2 i4 q6 f+ R" v( r3 W- W0 a0 L; H) }        }3 c8 \6 H  l4 {$ w3 h8 W  {) F
        else  [0 t9 d( R: i3 Z
        {
5 D$ U- p; n' t/ |$ Q, K* ^                printf("No effective message!\n");% |9 S+ t6 N! p7 _0 T' D7 C* x
        }7 t3 p0 R  W7 y  H" u6 h% n
}& Q) Y! Q% v6 L3 D9 C% ^
5 N7 ?& t" c% w9 V( I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 N$ ^% ?" {( N* P% ]8 m8 }8 }0 |4 J: R- l

& K# D" K) Y2 z: m- j1 `7 a
; m0 i6 B& T4 b1 m, U! j
1 t+ H7 `& {% L- a# V: W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 14:47 , Processed in 0.050082 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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