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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' L+ j: K1 d. F. B
; d4 ~# o) X5 O* k  c/ n9 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 w; ?  `  }& S#include <unistd.h>7 W/ H+ _" K% J5 j
#include <sys/mman.h>
9 ]% A# \( N; J+ l% T, D  I#include <sys/types.h>% S$ ^) ~% Q8 ~. _
#include <fcntl.h>
$ K( y2 r3 G  P/ b) ]
# U( U  z- s5 p2 S) l  {#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, O0 ?$ w0 F/ ~9 I, e' Z7 A% e! m$ j8 s8 k. g2 }
typedef struct
: X6 g& M5 \: i' _{
/ k: C6 I, e* N2 u        unsigned int a;
6 |& U. z$ A- E" d# s7 t8 V/ x        unsigned int b;
. d3 q4 L  |- N: o: l* E$ D; q        unsigned int packet_cout;
, o+ k+ Y5 |9 ?  y5 s4 B# o$ c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 Y( |, {! Q0 ?9 K9 \) Y! o1 A6 @) a/ A& z. O9 H3 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 D/ |( A( D' I! P
unsigned int count_copy = 0;6 ~8 O# \& k2 A/ r7 m

' N- X6 q/ f0 ]% B0 O" P# O
4 n0 |' T4 `5 H* lint main()& \' h/ Z/ q  y. ]: y' L
{, f4 T' O) B( o$ d
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 v& q7 s6 w* V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 {9 \' @; D1 @  n! J4 i5 y8 Y1 k1 q( M4 \# @4 q
        while(1)
3 L* F' ^# [, t$ c        {" y' ~) |" e2 k
                read_MSG_buffer(pshreRAM);
; `! m! c' P0 w, K( [        }               
* f( N$ E. H$ y' O) p1 M, t}
+ u& I+ M+ j9 q3 |3 Z2 ?" C  E) x! \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 y' A# J) k- q5 K! p{3 H7 x- A: N' ^" Y
        RX_MSG_PROTOCOL buf;
* C8 Q; j  x$ r1 L9 r+ n# [6 Y        6 v' p- _2 C2 g/ z. C
        buf.a = pshreRAM->a;
: q- \- [# I3 w/ b        buf.b = pshreRAM->b;
5 f# T0 {2 j2 \) S        buf.packet_cout = pshreRAM->packet_cout;+ l+ R: f3 t: ^' `
        
$ R5 w# r1 r( G! \        if(buf.packet_cout != count_copy)9 Q- h0 L0 o# h6 }1 T- ~
        {4 E) @* B& p0 u' }2 J$ u
                printf("a is %d\n", buf.a);
; p6 u! ]3 @- G6 w                printf("b is %d\n", buf.b);/ X* D* Q5 k" u) B1 S- R
                printf("count is %d\n", buf.packet_cout);4 a. J. P: I9 B6 c4 @8 X% B% \
                count_copy = buf.packet_cout;
$ s" _3 X) Z* I1 e  I9 [$ s6 }        }
6 ~, z4 I! D* A        else: p4 D& I* i; T$ y
        {( e" T8 q; R: G3 v+ b: t3 l" a
                printf("No effective message!");
/ P2 @5 K% W$ m$ P        }# x# s9 D9 L6 ?) a  n
}
' y0 A1 K4 v  n) W  F( k2 y4 F: K: r' A8 C" R

$ z0 N% g9 g3 y' V- m; M- R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; Z# M4 _- I8 d" |+ O
使用下面代码,对内存使用了mmap函数后:
, E( h% k( M2 W, W- @% b4 ^#include <stdio.h># l) R& Q8 v. s* a9 H
#include <unistd.h>
$ d) `  M6 v* E$ p- u#include <sys/mman.h>+ E0 _  k8 i7 y( X
#include <sys/types.h>" f2 R( W+ P) Q4 P  R' v
#include <fcntl.h>
* h4 O! p3 w  ~) z/ {% w% y0 E' C5 X' `
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 F) t# d3 [# P2 j
#define SHAER_RAM_SIZE         (0x20000)   
) A+ b; y7 j  q( z; @# i5 b' l! R+ ?- i
  m$ {$ J1 B, a6 P1 n3 vtypedef struct
. D8 T. t- J7 L+ p( b  u{, j0 `' K5 `+ E8 X9 a* t
        unsigned int a;' s) T7 `; @4 W+ C, ^# }
        unsigned int b;
. V" }, D/ v6 K  Y+ B; S        unsigned int packet_cout;
2 E# W9 Q( V5 o" g) V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- N! X' u3 n9 m, G0 X1 l: |  a9 ~

  S6 n% B6 S! A% Mvoid read_MSG_buffer(int *baseaddr);
: ~9 W0 x0 q8 s/ v& a3 @: S- Funsigned int count_copy = 0;
$ ?7 a% f, @0 y! K: Z$ x3 I+ u5 X0 m+ m0 t
int main(), W' Z9 `; y6 J; F/ n
{: T) n, C) C. e/ Z7 S
        int fd;
' u" A6 _  p7 V4 o: [: z  h        int *mem = NULL;) `& ?3 X9 S/ n" @9 l

( R6 O6 Y. U8 I0 r2 H# ^' _        if((fd = open("/dev/mem", O_RDWR)) <0)
/ s1 K7 J9 J* q" E2 c        {
9 a+ ]) [1 Q; V/ y- d3 g1 P# S                perror("open error");
/ X" k2 U, f( V4 B9 Q                return -1;0 Z6 i9 L4 K/ c  Q: F! W! e
        }
8 c& j* q2 J+ W4 |/ y        
% p8 x$ }6 B: ]) M$ w) B3 ~9 S8 ?' A) _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' }) n: L4 v2 T# v8 j
  x( z# {  @; k6 x, n        while(1)
- t$ R& L3 b5 e! q        {
- l4 s! e$ q5 G/ k7 Z7 [* k  Q                read_MSG_buffer(mem);
/ f8 Z, T% O" U        }                # X' n5 m7 L$ a
}
& b4 o7 D4 S" L
$ Q: N, l  M  A  R- ^- }; \void read_MSG_buffer(int *baseaddr)
! V; G6 O+ j/ I; Q& s  G2 M{
% Q4 W$ X" r, @        pRX_MSG_PROTOCOL pshreRAM = NULL;8 ?$ _) ]& V1 L7 I2 j" N( z2 b

7 |$ E  x+ Y2 x) ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ M% d9 w* l; g: i7 b3 l6 r) j  J
# U9 G  w1 k% b* t        if(pshreRAM->packet_cout != count_copy)3 f8 L$ ]* C4 n5 X  P9 E
        {. T! D+ |- l5 m8 P# L1 R0 U% Y, f
                printf("a is %d\n", pshreRAM->a);) F# K. O7 u7 |* u' ~4 {$ x2 e
                printf("b is %d\n", pshreRAM->b);3 c" _8 f5 R9 k
                printf("count is %d\n", pshreRAM->packet_cout);
' Y5 a# H& r* J4 L1 w9 j  ]% n                count_copy = pshreRAM->packet_cout;5 h( U, `2 R4 q; |  V8 e
        }. b1 _3 a# I4 _3 I1 m' C* P- p
        else
4 _  R: [5 `' ?+ q        {
$ z3 g0 v# i: ]3 i) `                printf("No effective message!\n");
, g0 ^1 v0 u! V& v6 G% @+ R7 j        }4 y3 L0 i8 }* }7 c* T/ G
}
# ^4 s, X' ^/ {/ v/ g8 b: u. V% N/ e7 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 |/ ~' T7 r- @& D. T  y

0 t$ v8 A6 j5 P' r( u3 o. q. |3 \3 V( {
) _. b8 ~0 x2 }& M2 U

8 R/ k8 K" x! e3 P1 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 00:40 , Processed in 0.043192 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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