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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 ?( J# P7 O1 e: X; y

+ ^0 [( r5 }+ v3 S" {  Z  XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 p8 o" E( e& x3 s3 i& H3 z7 d- l4 F
#include <unistd.h>& K" s* p; D% O4 V5 I4 p, i% j
#include <sys/mman.h>
9 z7 ^8 |- K- [7 V: b/ y6 @8 T#include <sys/types.h>7 [" A5 X" K" j6 r
#include <fcntl.h>/ F3 E3 B# n3 u9 z
) d) G2 A1 i# ]% _. T6 R0 u; z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   / r" m9 K+ K9 o( a$ ]4 L9 q

/ y8 u* h  A, b1 Y1 V# i5 c+ @* Rtypedef struct
5 _7 x$ p! @( f4 t5 \) W, q{
/ O) _8 G. w9 E        unsigned int a;- j, F! ~+ E2 m+ V$ ~3 v# ~% r
        unsigned int b;
* X: s) R& c! i+ f8 M        unsigned int packet_cout;
7 v0 Y" r* W0 B7 L. k. K# T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# O% X& C- H! p$ t. G% o: y5 J' w( P+ n( i7 o' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 j" I' B0 }+ G' x
unsigned int count_copy = 0;: w1 x/ L# `# _& T2 F5 X# @. ^
+ k$ ~. ^4 Y: |. {
- V1 @: C* e& j. e& e
int main()$ c4 C. I8 L3 m, `8 u
{
7 H% l2 |0 T7 m% d) T& u        pRX_MSG_PROTOCOL pshreRAM = NULL;- j% d' f, i. ^4 D2 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% C2 M3 P7 ?* O( v) i+ c8 O
) c! z8 Z7 T6 S
        while(1)7 ^& T' n1 A" n7 C. `
        {( L# G% M+ o9 m% B! |
                read_MSG_buffer(pshreRAM);
1 }, O) J0 j& o" n- |0 N$ z        }               
; ]2 ?+ M9 s2 c: e- J}
5 O6 \# _2 M/ T* T5 x1 W. H
4 |5 Q% }4 X; y3 ~- lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- C3 Y$ U5 r' q( t
{
5 m+ v0 Q- T# Z, ?3 t* T5 t; D        RX_MSG_PROTOCOL buf;- O- i' D% K1 D; ^: Z' [
        ! Z9 d7 u- D" O
        buf.a = pshreRAM->a;- d8 o5 R7 C! X: Y& ?* e; e
        buf.b = pshreRAM->b;
1 y. _5 K' j+ ^  @! N0 R        buf.packet_cout = pshreRAM->packet_cout;, s( L+ @* I3 v* A
        ( b* X$ N' K4 n5 X9 K2 h
        if(buf.packet_cout != count_copy)$ o& S' P3 E5 L
        {3 T: M9 Q% A2 B$ T
                printf("a is %d\n", buf.a);
+ n' W, H! f9 y. V; p                printf("b is %d\n", buf.b);8 I- c7 U2 i$ l) q
                printf("count is %d\n", buf.packet_cout);
  \0 L# y1 O  Y, z4 [& }7 \                count_copy = buf.packet_cout;
* Q* c" [& K) c0 A( j/ A        }+ N- W! T4 [! |( L/ V
        else6 ]1 L1 }+ u  ]4 c
        {
! Y( g7 B  V0 ^5 G                printf("No effective message!");
( K+ R( e  ~/ W7 A        }& M3 L& D) k) k8 U: s; k: Z1 }$ l& x
}
: l0 e; l/ L* k  I0 q$ r6 ~
& {  v, Z% S' v2 p) z! q& |. k
% D- ]% q* ]# ^" ~- u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- b+ t9 ~( s( g3 h4 P7 _使用下面代码,对内存使用了mmap函数后:  J9 B) C5 X' }: P9 M
#include <stdio.h>
; B1 ]% u+ _# [& Q: i  l0 ]1 V#include <unistd.h>
3 u3 j* o3 \5 B# Y) [$ S0 {#include <sys/mman.h>. S$ Z0 e* B" f" A( }0 m. y
#include <sys/types.h>
$ q, C0 `3 n8 c#include <fcntl.h>$ w. Y7 t( ~* C( L& P$ s
5 V, G! ^4 x. U7 R. ?" @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 ~- i8 W3 [" Q8 Y#define SHAER_RAM_SIZE         (0x20000)   8 D) j' L) B/ n( ~- X5 d# |

' D1 v  u# ^) B+ |+ q& o& v! Vtypedef struct& G; j% d1 V# f6 K9 Z) j
{
$ {: H$ z; C% b        unsigned int a;
$ Q; w( R( b6 r0 P3 U) g0 i        unsigned int b;
( [% C7 S$ k. [5 n& t        unsigned int packet_cout;$ e1 ?1 N& e0 \1 ]4 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% C% u9 h# C% t4 ?1 \# z5 A

& w) l4 S& e' l( N9 d5 P( svoid read_MSG_buffer(int *baseaddr);
9 S% S3 k8 U6 u" qunsigned int count_copy = 0;0 m0 J  A, H* A  y# Q0 _

4 ~2 f: s- A2 Wint main()0 g% r7 ?+ b$ C7 s6 l# |- S
{
; Q. h- m9 K9 N2 ]) r5 k, V        int fd;
# k7 ]% g- }, v& C! w7 j        int *mem = NULL;* N! p- |0 y1 M2 R

5 |. X) ?: I, r        if((fd = open("/dev/mem", O_RDWR)) <0)
- }" t% d% V# a# n( b        {
& ]8 _  T6 u% N2 a                perror("open error");
1 C- i6 _3 H$ c5 u                return -1;
2 _  `! F# I# ]: \# Q2 o        }$ l& Q  C$ ^! w, ~8 Q/ S
        
+ L8 i+ ?4 F$ N8 _: }$ a8 e# Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ J+ t7 Y  P7 L* B  j+ B8 J- z
4 V) w. I$ n& b; u' z( _
        while(1)/ T' k* P/ L9 e8 _# j
        {5 j. ?" f7 g  _6 d7 f0 q
                read_MSG_buffer(mem);
9 m5 S% d$ U! }2 X# U" O/ @5 @: Y        }                4 l- Q+ z# e& h
}
1 ]- ^$ v5 g% O) `( O. _5 {
9 i. n. \8 i# f8 D+ X' A1 }3 cvoid read_MSG_buffer(int *baseaddr)2 f0 v6 `# G4 W( }. g4 C
{
. q$ V. N6 t! m4 D: @        pRX_MSG_PROTOCOL pshreRAM = NULL;: J6 G- m  b1 }# A6 ?* V" e
% ]$ k: e0 S& A' H( a: r  D* `- S; @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! P4 v$ Q, h/ g7 a2 m
# k' ]& \4 t; d" ~% j
        if(pshreRAM->packet_cout != count_copy)
- ?- N+ j- `' c2 e7 `+ n7 @4 R        {
0 v2 f# z6 S9 u" P7 y& P                printf("a is %d\n", pshreRAM->a);
  @2 n1 v) o2 J/ N  a                printf("b is %d\n", pshreRAM->b);
6 o5 b( H5 b$ ~3 ~( l% U                printf("count is %d\n", pshreRAM->packet_cout);
+ [$ i% s+ D) E3 Z  |' {                count_copy = pshreRAM->packet_cout;
9 e- [/ }" G- ]; n: i        }" E+ D; O( i& C
        else
7 M, V* [4 E8 F4 r        {
) n5 i2 u. f' w: ~                printf("No effective message!\n");' g. }) T: S+ ^& a8 [4 M
        }
1 L0 i* F3 i2 u% S}
" ?  f% _% d* V7 n9 Q, F2 e
% q3 l! \! D+ h) L/ B" `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 S2 Q( `: }. `  ?; g
5 K3 s" _3 K5 A% _* R
0 v' c: G9 h9 }  t6 z) k# ~

& B9 U' e  [8 t% R
5 P6 c, @$ F) w/ ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 18:23 , Processed in 0.038697 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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